工厂方法和私有变量

rhl*_*lee 5 php oop design-patterns factory

我正在使用工厂类来创建另一个类的实例,比如Product类.

如何在工厂类中设置Product类中的私有变量?我应该这样做吗?

我打算做的是公共setter方法,然后在完成后冻结或锁定实例.但我觉得这是做错事的错误方法.

你会怎么解决这个问题?

编辑:

是的我想使用@derekerdmann的不可变对象方法.但我可能应该首先提供更多信息.

我正在php中编写一个类似HTML语言的解析器,因此您可以获得节点,而节点又可以包含其他节点.因此工厂是一个生成节点层次结构的解析器.如果你好奇,这里是代码http:// http://bazaar.launchpad.net/~rhlee/band-parser/dev/view/head:/src/bands.php

问题是,在我走下文档的其余部分之前,我不知道子节点是什么.所以我无法传递给构造函数.

有时我认为即使我希望它只在解析后才能读取,为什么会这样?我以php的DOMDocument解析器为例.您可以解析HTML文件,然后仍然可以修改结构.但是,这样您可以使用新更改再次重现HTML.我的解析器是单向解析器,因此解析后编辑结构的需要是不存在的.

der*_*ann 3

执行此操作的典型方法是创建不可变对象。在不可变对象中,所有私有字段都是通过将值传递到对象的构造函数中来设置的。不可变==不可修改。

如果您确实需要一种方法来更改私有字段,那么 setter 方法实际上会使用更改后的字段创建一个新实例。

Java 类示例:

class ImmutableDuck {

    private final String name;
    private final int age;

    /**
     * Constructor - sets the read-only attributes of the duck
     */
    public ImmutableDuck( String name, int age ){
        this.name = name;
        this.age = age;
    }

    public String getName(){
        return name;
    }

    public int getAge(){
        return age;
    }

    /**
     * Creates a new ImmutableDuck with the current object's age 
     * and the given age
     */
    public ImmutableDuck setName( String name ){
        return new ImmutableDuck( name, age );
    }

}
Run Code Online (Sandbox Code Playgroud)