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

  • 目的

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

  • 主要角色

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

  • 优缺点

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

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


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

你可能感兴趣的:(创建型设计模式->抽象工厂模式)