php设计模式之工厂方法
2017-06-04 19:17
447 查看
前面我们介绍了简单工厂,今天我们继续学习另外一个工厂——工厂方法。
具体案例:请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我们一般采用FactoryMethod模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
工厂方法模式核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节,如下图:
工厂方式模式主要由以下几种角色组成:
抽象工厂角色(IServerFactory):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂角色(ChickenLegBaoFactory):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品角色(IHanbao):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品角色(ChickenLegBao):这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
根据以上UML类图和角色编写以下PHP代码:
[php] view
plain copy
print?
<?php
/**
* Created by PhpStorm.
* User: Jiang
* Date: 2015/4/16
* Time: 22:12
*/
/**抽象产品角色 汉堡
* Interface IHanbao
*/
interface IHanbao
{
function Allay();
}
/**具体产品角色 肉松汉堡
* Class RouSongBao
*/
class RouSongBao implements IHanbao
{
function Allay()
{
echo "I am 肉松汉堡,小的给主人解饿了!<br/>";
}
}
/**鸡肉汉堡
* Class ChickenBao
*/
class ChickenBao implements IHanbao
{
function Allay()
{
echo "I am 鸡肉汉堡,小的给主人解饿了!<br/>";
}
}
/**抽象工厂角色
* 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();
}
}
测试代码:
[php] view
plain copy
print?
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.管理上的难度
假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。
具体案例:请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我们一般采用FactoryMethod模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
工厂方法模式核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节,如下图:
工厂方式模式主要由以下几种角色组成:
抽象工厂角色(IServerFactory):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂角色(ChickenLegBaoFactory):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品角色(IHanbao):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品角色(ChickenLegBao):这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
根据以上UML类图和角色编写以下PHP代码:
[php] view
plain copy
print?
<?php
/**
* Created by PhpStorm.
* User: Jiang
* Date: 2015/4/16
* Time: 22:12
*/
/**抽象产品角色 汉堡
* Interface IHanbao
*/
interface IHanbao
{
function Allay();
}
/**具体产品角色 肉松汉堡
* Class RouSongBao
*/
class RouSongBao implements IHanbao
{
function Allay()
{
echo "I am 肉松汉堡,小的给主人解饿了!<br/>";
}
}
/**鸡肉汉堡
* Class ChickenBao
*/
class ChickenBao implements IHanbao
{
function Allay()
{
echo "I am 鸡肉汉堡,小的给主人解饿了!<br/>";
}
}
/**抽象工厂角色
* 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();
}
}
测试代码:
[php] view
plain copy
print?
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.管理上的难度
假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。
相关文章推荐
- PHP中的设计模式-简单工厂,静态工厂,工厂方法,抽象方法的关系
- PHP设计模式一:工厂方法设计模式
- 初识PHP设计模式--工厂方法
- PHP设计模式——工厂方法
- PHP设计模式:工厂方法
- PHP设计模式之工厂方法设计模式实例分析
- php设计模式——工厂方法设计模式
- GoF 23个经典的设计模式03--创建模式之工厂方法(未完代续)
- 设计模式--工厂方法
- 设计模式(1)工厂方法 感觉没必要用工厂方法
- C# 设计模式 之 工厂方法
- 设计模式 之 工厂方法
- 设计模式之Factory,Java工厂方法
- 一番话:设计模式之工厂方法。
- 每周一个设计模式之工厂方法与抽象工厂
- 设计模式学习笔记四:工厂方法(Factory Method)
- 设计模式(三)、FACTORY METHOD(工厂方法)---对象创建型模式
- 第二个设计模式:工厂方法
- 设计模式--工厂方法
- 设计模式杂谈:创建型模式之工厂方法(Factory Method)