原型模式---抽象工廠模式的變形(兄弟)

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());








發佈了66 篇原創文章 · 獲贊 6 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章