Exemple #1
0
<?php

$factory = new TerrainFactory(new EarthSea(-2), new EarthForest(), new EarthPlains());
print_r($factory->getSea());
print_r($factory->getForest());
print_r($factory->getPlains());
Exemple #2
0
    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>";
Exemple #3
0
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());
Exemple #4
0
    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();
Exemple #5
0
    {
        $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();