class sea{}; class EarthSea extends sea{}; class MarsSea extends sea{}; class Plains{}; class EarthPlains extends Plains{}; class MarsPlains extends Plains{}; class Forest{}; class EarthForest extends Forest{}; class MarsForest extends Forest{}; class TerrainFactory{ private $sea; private $plains; private $forest; 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 EarthPlains(),new EarthPlains(),new EarthForest()); print_r($factory->getSea()); print_r($factory->getPlains()); print_r($factory->getForest()); //實例二 $factory2 = new TerrainFactory(new EarthSea(),new MarsPlains(),new MarsForest()); print_r($factory2->getSea()); print_r($factory2->getPlains()); print_r($factory2->getForest());
從上面我們可以看出,這樣的代碼更具有靈活性,我們可以靈活的創建出多個工廠,而且我們可以靈活的向工廠中傳遞參數,只有符合規定的類即可,例如下面的例子。
class EarthTwoSea extends Sea{ private $navigability = 0; function __construct($navigability){ $this->navigability = $navigability; } }; //實例三 $factory3 = new TerrainFactory(new EarthTwoSea(-1),new MarsPlains(),new MarsForest()); print_r($factory3->getSea()); print_r($factory3->getPlains()); print_r($factory3->getForest());