php工厂方法模式

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 结果展示

 

 

技术交流

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值