生成对象---抽象工厂

问题

在大型应用中,需要工厂来生产一组相关实现的架构

uml

代码

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

 

 

结果

将系统与实现的细节分开,可以在示例中添加或删除任意数目的编码风格而不会影响系统

对系统中功能相关的的元素强制进行组合。因此通过使用Blogscommonmanager可以确保只使用与BlogsCal相关的类

添加新产品非常麻烦,不仅要创建新产品的具体实现,而且为了支持它,还必须修改抽象创建者和它的每一个具体实现

 

 

原型模式

问题

平行继承层次的出现时工厂方法模式带来的一个问题,这是一种耦合,每次添加产品家族时,你被迫去创建相关的具体创建者(比如编码器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);
?>

 

posted @ 2016-11-14 14:41  rcj_飞翔  阅读(230)  评论(0编辑  收藏  举报