生成對象---抽象工廠

問題php

在大型應用中,須要工廠來生產一組相關實現的架構架構

umlthis

代碼編碼

<?php
/*
abstractFactory.php
抽象工廠模式產生一組相關的類
*/
abstract class CommonManager{
    abstract function getHeaderText();
    //抽象工廠方法
    abstract function getApptEncoder();
    //抽象工廠方法
    abstract function getTtdEncoder();
    //抽象工廠方法
    abstract function getContactEncoder();
    abstract function getFooterText();
}


class BlogsCommonManager extends CommonManager{
    function getHeaderText(){
        return "BlogsCal header\n";
    }

    //獲取blogs格式的預定對象
    function getApptEncoder(){
        return new BlogsApptEncoder();
    }

    //獲取blogs格式的待辦事宜對象
    function getTtdEncoder(){
        return new BlogsTtdEncoder();
    }

    //獲取blogs格式的聯繫人對象
    function getContactEncoder(){
        return new BlogsContactEncoder();
    }
    function getFooterText(){
        return "BlosCal footer\n";
    }
}

abstract class ApptEncoder{
    abstract function encoder();
}

class BlogsApptEncoder extends ApptEncoder{
    function encoder(){
        return "Blogs Appt encoder";
    }
}

abstract class TtdEncoder{
    abstract function encoder();
}

class BlogsTtdEncoder extends TtdEncoder{
    function encoder(){
        return "Blogs Ttd encoder";
    }
}

abstract class ContactEncoder{
    abstract function encoder();
}

class BlogsContactEncoder extends ContactEncoder{
    function encoder(){
        return "Blogs Contact encoder";
    }
}

$BlogsCommonManager = new BlogsCommonManager();
//create ApptEncoder obj
$BlogsCommonManager->getApptEncoder();
//create TtdEncoder obj
$BlogsCommonManager->getTtdEncoder();
//create ContactEncoder obj
$BlogsCommonManager->getTtdEncoder();
?>

 

 

結果spa

將系統與實現的細節分開,能夠在示例中添加或刪除任意數目的編碼風格而不會影響系統prototype

對系統中功能相關的的元素強制進行組合。所以經過使用Blogscommonmanager能夠確保只使用與BlogsCal相關的類rest

添加新產品很是麻煩,不只要建立新產品的具體實現,並且爲了支持它,還必須修改抽象建立者和它的每個具體實現code

 

 

原型模式對象

問題blog

平行繼承層次的出現時工廠方法模式帶來的一個問題,這是一種耦合,每次添加產品家族時,你被迫去建立相關的具體建立者(好比編碼器BlogsCal和BlogsCommonManager)

實現

建立一個保存具體產品的工廠類,並在初始化時就加入產品,這樣減小類的數量

代碼實現

<?php
/*
prototype.php
*/

class Sea{
    private $navigability = 0;
    function __construct($navigability){
        $this->navigability = $navigability;
    }

    function __set($pro,$vaue){
        $this->$pro = $vaue;
    }
}
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{}

//帶有產品對象實例的具體的TerrainFactory對象
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;
    }

}


//client
$factory = new TerrainFactory(new EarthSea(-1),new MarsPlains(),new EarthForest());
$sea1 = $factory->getSea();
$sea2 = $factory->getSea();
$sea1->navigability = 1;
$sea2->navigability = 2;
print_r($sea1);
print_r($sea2);
?>
相關文章
相關標籤/搜索