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.我的解析器是单向解析器,因此解析后编辑结构的需要是不存在的.
执行此操作的典型方法是创建不可变对象。在不可变对象中,所有私有字段都是通过将值传递到对象的构造函数中来设置的。不可变==不可修改。
如果您确实需要一种方法来更改私有字段,那么 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)