设计模式:工厂模式 [PHP相关]

作者:上班偷偷打酱油 发布于:2015-11-26 浏览:2313次 收藏

原理剖析:

意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使用一个类的实例化延迟到其子类

结构图:

blob.png

主要角色

抽象产品(Product)角色:具体产品对象共有的父类或接口
具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,并且工厂方法模式所创建的每一个对象都是某具体产品对象的实例
抽象工厂(Creator)角色:模式中任何创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Product类型的对象。
Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的的ConcreteProduct对象
具体工厂(Concrete Creator)角色:实现抽象工厂接口,具体工厂角色与应用逻辑相关,由应用程序直接调用以创建产品对象。

工厂模式的优点
工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

工厂模式的缺点
客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类

工厂模式适用场景
1、当一个类不知道它所必须创建的对象的类的时候
2、当一个类希望由它的子类来指定它所创建的对象的时候
3、当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候

实例

<?php

 
 /**
 * 抽象工厂角色
 */
 interface Creator {
    public function factoryMethod();
 } 
    
 /**
 * 具体工厂角色A
 */
 class ConcreteCreatorA implements Creator {     
     /**
     * 工厂方法 返回具体 产品A
     * @return ConcreteProductA
     */
    public function factoryMethod() {
        return new ConcreteProductA();
    }
 }
 
 /**
 * 具体工厂角色B
 */
 class ConcreteCreatorB implements Creator {     
    /**
     * 工厂方法 返回具体 产品B
     * @return ConcreteProductB
     */
    public function factoryMethod() {
        return new ConcreteProductB();
    }
 } 
 
/**
 * 抽象产品角色
 */
 interface Product {
    public function operation();                               
 } 

/**
 * 具体产品角色A
 */
 class ConcreteProductA implements Product {     
       /**
     * 接口方法实现 输出特定字符串
     */
    public function operation() {
        echo 'ConcreteProductA <br />';
    }
 } 
  
/**
 * 具体产品角色B
 */class ConcreteProductB implements Product {     
       /**
     * 接口方法实现 输出特定字符串
     */
    public function operation() {
        echo 'ConcreteProductB <br />';
    }
  } 
  
class Client {     
     /**
     * Main program.
     */
    public static function main() {
        $creatorA = new ConcreteCreatorA();
        $productA = $creatorA->factoryMethod();
        $productA->operation();         
        $creatorB = new ConcreteCreatorB();
        $productB = $creatorB->factoryMethod();
        $productB->operation();
    } 
} 
    
Client::main();
?>


如果文章对您有所帮助,希望继续支持我们,您的支持是我们最大的动力 ¥打赏
标签: 设计模式 工厂模式
声明:文章内容由作者原创或整理,未经允许,不得转载!
  • 评论于 2016-06-23 16:09:21

    不错

    回复
您需要登录后才可以评论。登录 | 立即注册