当前位置: 移动技术网 > IT编程>开发语言>PHP > PHP设计模式——工厂方法

PHP设计模式——工厂方法

2018年09月21日  | 移动技术网IT编程  | 我要评论
  前面我们介绍了简单工厂,今天我们继续学习另外一个工厂——工厂方法。   具体案例:请mm去麦当劳吃汉堡,不同的mm有不同的口味,要每个都记住是一件烦人

 

前面我们介绍了简单工厂,今天我们继续学习另外一个工厂——工厂方法。

 

具体案例:请mm去麦当劳吃汉堡,不同的mm有不同的口味,要每个都记住是一件烦人的事情,我们一般采用factorymethod模式,带着mm到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让mm直接跟服务员说就行了。

工厂方法模式核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节,如下图:
\

工厂方式模式主要由以下几种角色组成:

抽象工厂角色(iserverfactory):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

具体工厂角色(chickenlegbaofactory):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

抽象产品角色(ihanbao):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是light。

具体产品角色(chickenlegbao):这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

 

根据以上uml类图和角色编写以下php代码:

 

;
    }

}

/**鸡肉汉堡
 * class chickenbao
 */
class chickenbao implements ihanbao
{
    function allay()
    {
        echo i am 鸡肉汉堡,小的给主人解饿了!
;
    }

}

/**抽象工厂角色
 * interface iserverfactory
 */
interface iserverfactory
{
    function makehanbao();
}

/**具体工厂角色     肉松汉堡工厂
 * class rousongfactory
 */
class rousongfactory implements iserverfactory
{

    function makehanbao()
    {
        return new rousongbao();
    }
}

class chickenfactory implements iserverfactory
{

    function makehanbao()
    {
        return new chickenbao();
    }
}

测试代码:

 

 

header(content-type:text/html;charset=utf-8);
//------------------------工厂方式测试代码------------------
require_once ./factorymethod/factorymethod.php;

//-----------------餐厅厨师-----------
$chickenfactory=new chickenfactory();
$rousongfactory=new rousongfactory();

//-----------点餐------------
$chicken1=$chickenfactory->makehanbao();
$chicken2=$chickenfactory->makehanbao();
$rousong1=$rousongfactory->makehanbao();
$rousong2=$rousongfactory->makehanbao();

//------------------顾客吃饭---------
$chicken1->allay();
$chicken2->allay();
$rousong1->allay();
$rousong2->allay();

用运行测试代码我们可以发现,顾客都享用了自己的食物。

 

 

工厂方法模式优缺点:

优势:克服了简单工厂模式违背开放-封闭的原则,保持了封装对象创建过程的优点。

缺陷:当增加产品时,就得增加一个产品工厂的类,增加额外的开发量。避免不了分支判断的问题。

 

简单工厂模式与工厂方法模式的比较:

 

1. 结构复杂度

简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,从而增加了结构的复杂程度。

2.代码复杂度

代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。

3.管理上的难度

假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。

 


如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网