<?php $factory = new TerrainFactory(new EarthSea(-2), new EarthForest(), new EarthPlains()); print_r($factory->getSea()); print_r($factory->getForest()); print_r($factory->getPlains());
function __construct(Sea $sea, Plains $plains, Forest $forest) { $this->sea = $sea; $this->plains = $plains; $this->forest = $forest; } function getSea() { return clone $this->sea; } function getForest() { return clone $this->forest; } function getPlains() { return clone $this->plains; } } // вместо того что бы описывати классы типа MarsTerrainFactory и EarthTerrainFactory // мы сами создаём прототип фабрики в которую передаём экземпляры нужных нам классов $factory = new TerrainFactory(new EarthSea(1), new EarthPlains(), new EarthForest()); // Здесь мы загружаем в экземпляр конкретной фабрики типа TerrainFactory экземпляры объектов наших "поверхностей". // Когда в клиентском коде вызывается метод getSea(), ему возвращается клон объекта Sea, // который мы поместили в кэш во время инициализации. Так мы не только сократили пару классов, но и получили гибкость, // можно создать фабрику которая, например создаёт планету с морями и лесами как на Земле, и с равнинами как на марсе. echo "<pre>"; var_dump($factory->getSea()); var_dump($factory->getPlains()); var_dump($factory->getForest()); echo "<pre>";
class MarsForest extends Forest { } class TerrainFactory { private $sea; private $forest; private $plains; function __construct(Sea $sea, Plains $plains, Forest $forest) { $this->sea = $sea; $this->plains = $plains; $this->forest = $forest; } function getSea() { return clone $this->sea; } function getPlains() { return clone $this->plains; } function getForest() { return clone $this->forest; } } $factory = new TerrainFactory(new EarthSea(-1), new EarthPlains(), new EarthForest()); print_r($factory->getSea()->getNavigability()); print_r($factory->getPlains()); print_r($factory->getForest());
private $forest; private $plains; public function __construct(Sea $sea, Plains $plains, Forest $forest) { $this->sea = $sea; $this->plains = $plains; $this->forest = $forest; } function getSea() { return clone $this->sea; } function getPlains() { return clone $this->plains; } function getForest() { return clone $this->forest; } } /** * Создание фабрики с заданными параметрами прототипа */ $prototypeFactory = new TerrainFactory(new EarthSea(), new MarsPlains(), new VenusForest()); /** * Создание заданных объектов путём клонирования */ $sea = $prototypeFactory->getSea(); $plains = $prototypeFactory->getPlains(); $forest = $prototypeFactory->getForest();
{ $this->sea = $sea; $this->forest = $forest; $this->plains = $plains; } /** * @return Sea */ public function getSea() { return clone $this->sea; } /** * @return Plains */ public function getPlains() { return clone $this->plains; } /** * @return Forest */ public function getForest() { return clone $this->forest; } } $factory = new TerrainFactory(new EarthSea(), new EarthPlains(), new EarthForest()); $factory->getSea(); $factory->getForest(); $factory->getPlains();