不了解工厂模式的工作原理

时间:2015-12-14 02:25:09

标签: php oop factory

我创建了一个抽象工厂类,其中包含一个方法,用于存储工厂创建的所有对象的数组。

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只有第三个工厂的元素

非常感谢你的帮助

1 个答案:

答案 0 :(得分:1)

我怀疑这不是一个工厂而是一个集合。

话虽如此,我认为你的问题不在于模式,而在于克隆。

在PHP中,clone不是深层副本。

根据为ElementFactory提供的示例,您可能将SubElement设置为Element类的成员变量。

此克隆不遵循此链接并创建子元素的新副本。它将创建元素的新副本,但副本将通过指针复制到与原始文件相同的SubElement

这意味着在一个上调用getSubElementFactory与在另一个上调用它是相同的。从而创造了三个副本的错觉。

您可以做的是向您的班级添加__clone方法。此方法必须创建新的SubElement。 (也克隆了吗?)。

这将提供所需的行为。