Я создал абстрактный класс фабрики, который включает в себя метод, хранящий в массиве все объекты, которые создает фабрика.
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 все еще добавляется ко ВСЕМ элементам фабрики только в третьем?
Большое спасибо за вашу помощь
Я подозреваю, что это не фабрика, а коллекция.
При этом я думаю, что ваша проблема не в шаблоне, а скорее в клоне.
В PHP клон не глубокая копия.
На основании предоставленного образца ElementFactory
вы, вероятно, устанавливаете SubElement
как переменная-член класса Element.
Этот клон не переходит по этой ссылке и создает новую копию подэлемента. Это создаст новую копию элемента, но копия будет копировать указатель на тот же элемент SubElement
как оригинал.
Это означает, что вызов getSubElementFactory
на одном — это то же самое, что и на другом. Таким образом создается иллюзия трех экземпляров.
Что вы можете сделать, это добавить __clone
метод для вашего класса. Этот метод должен был бы создать новый SubElement
, (Клон это тоже?).
Это обеспечит желаемое поведение.
Других решений пока нет …