我创建了一个抽象工厂类,其中包含一个方法,用于存储工厂创建的所有对象的数组。
abstract class ItemFactory{
function __construct($default_item){
$this->default_item = $default_item;
}
// Returns a new item + add the item to the factory items collection
function createFactoryItem(){
$this->addFactoryItem($object = clone $this->default_item);
return $object;
}
// Add the item to the collection of items created with the factory
function addFactoryItem($item_obj){
$this->items[] = $item_obj;
return $this;
}
}
类ElementFactory扩展了ItemFactory,SubElement也是如此。
class ElementFactory extends ItemFactory{
function __construct(){
parent::__construct(new Element(new SubElement())));
}
}
我目前对以下示例中此工厂模式的行为感到困惑。
$element_factory = new ElementFactory();
$element_factory->createFactoryItem()->setElementId(1);
$element_factory->createFactoryItem()->setElementId(2);
// Here I create a variable that stores the third element created from the factory
// setElementId() method belongs to Element and return $this
$element_3 = $element_factory->createFactoryItem()->setElementId(3);
// Here the part creating weird results
$element_3->getSubElementFactory()->createFactoryItem();
var_dump($element_factory);
我的期望是这样的:
ElementFactory Items:
Array
[0]: Element 1
[1]: Element 2
[2]: Element 3
'-- [0] : SubElement 1
Instead I get this:
[0]: Element 1
'-- [0] : SubElement 1
[1]: Element 2
'-- [0] : SubElement 1
[2]: Element 3
'-- [0] : SubElement 1
我创建了一个单独的变量来存储工厂创建的第三个对象,并且方法getSubElementFactory() - >仅为第三个元素调用createFactoryItem():为什么SubElement对象仍然添加到ALL只有第三个工厂的元素?
非常感谢你的帮助
答案 0 :(得分:1)
我怀疑这不是一个工厂而是一个集合。
话虽如此,我认为你的问题不在于模式,而在于克隆。
在PHP中,clone不是深层副本。
根据为ElementFactory
提供的示例,您可能将SubElement
设置为Element类的成员变量。
此克隆不遵循此链接并创建子元素的新副本。它将创建元素的新副本,但副本将通过指针复制到与原始文件相同的SubElement
。
这意味着在一个上调用getSubElementFactory
与在另一个上调用它是相同的。从而创造了三个副本的错觉。
您可以做的是向您的班级添加__clone
方法。此方法必须创建新的SubElement
。 (也克隆了吗?)。
这将提供所需的行为。