yvv4git / php_design_patterns

Explore design patterns with php
0 stars 0 forks source link

здесь стоит усложнить примеры #5

Open PartyZan13 opened 4 years ago

PartyZan13 commented 4 years ago

https://github.com/yvv4git/php_design_patterns/blob/01d578cc4e5229a799b88b178fc6f84ffe55e789/src/Creational/Prototype/Priora.php#L5

потому что наличие в php ключевого слова clone слишком упрощает паттерн и неясно зачем он нужен. Поясню: 1) клонирование может иметь дополнительную логику - надо поменять какие-то поля. Счетчик там, или UUID новый сгенерировать (в примере с автомобилем - VIN-код), или скопировать приватное свойство в котором находится другой объект. При прямом клонировании, вложенный объект-свойство не склонируется, и оба клона будут ссылаться на одну копию вложенного объекта, что может оказаться неправильно по бизнес-логике. В таком случае имеет смысл ввести интерфейс PrototypeInterface, в котором обязать объект-прототип иметь метод clone() (ну или просто внутри прототипа определить магический метод __clone()). Таким образом сам объект прототип должен будет уметь себя правильно клонировать. А клиентскому коду это будет не нужно знать и не важно совершенно, как там прототип внутри устроен. 2) еще одна возможность - хранилище прототипов, где хранить разные прототипы. В примере с автомобилем: та же Приора, но в разных комплектациях, с разными опциями, с разными двигателями. Создал десяток разновидностей, поместил их в хранилище - и клонируй по ситуации ту, которая нужна.