美文网首页
创建型设计模式->抽象工厂模式

创建型设计模式->抽象工厂模式

作者: liu66_net | 来源:发表于2018-12-04 16:34 被阅读0次
    • 目的

      1.在不指定具体类的情况下创建一系列相关或依赖对象。 通常创建的类都实现相同的接口。 抽象工厂的客户并不关心这些对象是如何创建的,它只是知道它们是如何一起运行的。

    • 主要角色

      1.抽象工厂角色(Abstract Factory)声明抽象工厂接口,所有的具体工厂类必须实现这个接口或者继承这个类
      2.具体工厂角色(Concrete Factory)实现产品对象的操作,客户端调用直接生成产品
      3.抽象产品(Abstract Project)声明一个类产品的接口,它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
      4.具体产品(Concrete Project)实现抽象产品的接口,定义一个将被具体工厂所创建出来的产品对象

    • 优缺点

      1.增加替换产品变得更加容易,
      2.有利于产品的一致性(DB)
      3.难以支持新品类,这是因为抽象工厂(Abstruct Factory)已经确定了产品集合,如果支持新个类,就要拓展新的访问工厂接口,从而导致了抽象工厂类(Abstruct Factory)及其所有子类改变.
      4.抽象工厂就是以一种倾斜的方式支持增加新产品中,他为新产品组中的增加添加了方便,而不能为新产品结构改变.

    • 用反射优化抽象工厂
    • 代码1

    <?php
     /**
     * 抽象工厂模式
     * -------------
     * @author      zhaoxuejie <zxj198468@gmail.com>
     * @package     design pattern 
     * @version     v1.0 2011-12-14
     */
     
    //抽象工厂
    interface AnimalFactory {
        
        public function createCat();
        public function createDog();
        
    }
     
    //具体工厂
    class BlackAnimalFactory implements AnimalFactory {
        
        function createCat(){
            return new BlackCat();
        }
        
        function createDog(){
            return new BlackDog();  
        }
    }
     
    class WhiteAnimalFactory implements AnimalFactory {
        
        function createCat(){
            return new WhiteCat();
        }
        
        function createDog(){
            return new WhiteDog();
        }
    }
     
    //抽象产品
    interface Cat {
        function Voice();
    }
     
    interface Dog {
        function Voice();   
    }
     
    //具体产品
    class BlackCat implements Cat {
        
        function Voice(){
            echo '黑猫喵喵……';
        }
    }
     
    class WhiteCat implements Cat {
        
        function Voice(){
            echo '白猫喵喵……';
        }
    }
     
    class BlackDog implements Dog {
        
        function Voice(){
            echo '黑狗汪汪……';      
        }
    }
     
    class WhiteDog implements Dog {
        
        function Voice(){
            echo '白狗汪汪……';      
        }
    }
     
    //客户端
    class Client {
        
        public static function main() {
            self::run(new BlackAnimalFactory());
            self::run(new WhiteAnimalFactory());
        }
        
        public static function run(AnimalFactory $AnimalFactory){
            $cat = $AnimalFactory->createCat();
            $cat->Voice();
            
            $dog = $AnimalFactory->createDog();
            $dog->Voice();
        }
    }
    Client::main();
    ?>
    
    

    相关文章

      网友评论

          本文标题:创建型设计模式->抽象工厂模式

          本文链接:https://www.haomeiwen.com/subject/aynmcqtx.html