• 生成对象---抽象工厂


    问题

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

    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
    ";
        }
    
        //获取blogs格式的预约对象
        function getApptEncoder(){
            return new BlogsApptEncoder();
        }
    
        //获取blogs格式的待办事宜对象
        function getTtdEncoder(){
            return new BlogsTtdEncoder();
        }
    
        //获取blogs格式的联系人对象
        function getContactEncoder(){
            return new BlogsContactEncoder();
        }
        function getFooterText(){
            return "BlosCal footer
    ";
        }
    }
    
    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);
    ?>
  • 相关阅读:
    STL之vector
    STL之string
    STL之map
    STL之queue
    STL之set
    Ubuntu 12.04 输入法托盘图标消失
    Hibernate:No row with the given identifier exists
    Java 数组
    Oracle 简单备份 批处理(BAT)
    Oracle DataBase Link
  • 原文地址:https://www.cnblogs.com/rcjtom/p/6055250.html
Copyright © 2020-2023  润新知