Не понимая, как работает фабричный шаблон

Я создал абстрактный класс фабрики, который включает в себя метод, хранящий в массиве все объекты, которые создает фабрика.

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 все еще добавляется ко ВСЕМ элементам фабрики только в третьем?

Большое спасибо за вашу помощь

1

Решение

Я подозреваю, что это не фабрика, а коллекция.

При этом я думаю, что ваша проблема не в шаблоне, а скорее в клоне.

В PHP клон не глубокая копия.

На основании предоставленного образца ElementFactory вы, вероятно, устанавливаете SubElement как переменная-член класса Element.

Этот клон не переходит по этой ссылке и создает новую копию подэлемента. Это создаст новую копию элемента, но копия будет копировать указатель на тот же элемент SubElement как оригинал.

Это означает, что вызов getSubElementFactory на одном — это то же самое, что и на другом. Таким образом создается иллюзия трех экземпляров.

Что вы можете сделать, это добавить __clone метод для вашего класса. Этот метод должен был бы создать новый SubElement, (Клон это тоже?).

Это обеспечит желаемое поведение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector