php工厂方法模式

来源:互联网 发布:买家如何做淘宝客 编辑:程序博客网 时间:2024/05/16 09:44

CleverCode最近在看工厂方法模式。

1 模式介绍



 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。


2 模式中的角色



    2.1 抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
    2.2 具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
    2.3 抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
    2.4 具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。



3 模式结构



4 项目应用

4.1 加法减法引用工厂方法


4.2 类结构图


4.3 php源码设计


<?php/** * 工厂方法。由于简单工厂违背了开发-封闭原则 * 工厂方法。将这个改变放到了客户端 * copyright (c) http://blog.csdn.net/CleverCode     */// 运算抽象类  class Operation{  /*{{{*/    // 数字A      protected $_numberA = null;      // 数字B      protected $_numberB = null;      /**      * 设置成员A      *      * @param double $num 数字      * @return void      */      public function setNumberA($num){          $this->_numberA = $num;      }      /**      * 获取成员A      *      * @return double 数字      */      public function getNumberA(){          return $this->_numberA;      }      /**      * 设置成员B      *      * @param double $num 数字      * @return void      */      public function setNumberB($num){          $this->_numberB = $num;      }      /**      * 获取成员B      *      * @return double 数字      */      public function getNumberB(){          return $this->_numberA;      }      /**      * 获取运算结果      *      * @return double 数字      */      public function getResult(){          return null;      }  }  /*}}}*/// 加法类  class OperationAdd extends Operation{  /*{{{*/    /**      * 获取运算结果      *      * @return double 数字      */      public function getResult(){          return $this->_numberA + $this->_numberB;      }  }  /*}}}*/// 减法类  class OperationSub extends Operation{  /*{{{*/    /**      * 获取运算结果      *      * @return double 数字      */      public function getResult(){          return $this->_numberA - $this->_numberB;      }  }  /*}}}*///运算工厂interface IFactory{/*{{{*/    public function createOperate();}/*}}}*///加法工厂class AddFactory implements IFactory{/*{{{*/    public function createOperate()    {        return new  OperationAdd();     }}/*}}}*///减法工厂class SubFactory implements IFactory {/*{{{*/    public function createOperate()    {        return new OperationSub();     }}/*}}}*/class Client {/*{{{*/    public static function main($argv)    {       //简单工厂的switch case 放到了客户端了       $factory = new AddFactory();       $add = $factory->createOperate();       // 设置数字A         $add->setNumberA(5);                   // 设置数字B         $add->setNumberB(2);                   // 运算         echo $add->getResult()."\r\n";                }}/*}}}*/Client::main($argv);?>


4.4 结果展示




1 0
原创粉丝点击