声明:本系列博客参考资料《大话设计模式》,作者程杰。

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

        具体案例:请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我们一般采用FactoryMethod模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
        工厂方法模式核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节,如下图:

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

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

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

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

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

根据以上UML类图和角色编写以下PHP代码:

<?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();}
}

测试代码:

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设计模式——工厂方法相关推荐

  1. 设计模式 工厂方法_工厂方法设计模式

    设计模式 工厂方法 工厂方法模式是流行的创作设计模式之一. 它并不特别依赖于工厂对象来创建对象. 而是要在同一类中使用单独的方法来创建对象. Factory Method模式定义了一个用于创建对象的接 ...

  2. 设计模式 工厂方法_工厂设计模式–一种有效的方法

    设计模式 工厂方法 如您所知,"工厂方法模式"或俗称"工厂设计模式"是"创意设计模式"类别下的一种设计模式. 模式背后的基本原理是,在运行时 ...

  3. 设计模式 工厂方法_使用工厂方法模式设计最佳实践

    设计模式 工厂方法 在前面的"设计模式"示例中,我们解释了当今常用的"工厂"模式. 在本节中,我们将了解具有更多抽象的更高级的解决方案. 该模式称为工厂方法设计 ...

  4. 4. 星际争霸之php设计模式--工厂方法模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  5. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  6. 设计模式 | 工厂方法模式及典型应用

    工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...

  7. python工厂模式 django_python设计模式-工厂方法模式

    题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...

  8. 工厂方法模式_1天1个设计模式——工厂方法模式

    意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...

  9. [设计模式] ------ 工厂方法模式

    工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...

  10. JAVA设计模式 - 工厂方法模式

    工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...

最新文章

  1. TiDB 源码阅读系列文章(十八)tikv-client(上)
  2. SpringBoot使用教程【1】Restful API设计 返回json,xml格式...
  3. ADO.net数据访问
  4. JavaScript解决命名冲突的一种方法
  5. 【idea】idea如何配置JDK(转)
  6. mfc 中获得本身程序句柄的代码
  7. JAVA中的适配器应用_Java适配器模式应用之电源适配器功能详解
  8. ln创建、删除软/硬链接
  9. POJ2155 Matrix二维线段树经典题
  10. Java Error(四)
  11. php装箱,PHP实现的装箱算法示例
  12. 无法加载 Chrome PDF Viewer
  13. H264编码器性能测试
  14. 调通sina33下的AP6212A0版本的BT(V1.0)
  15. 忘记了Excel工作表保护密码的解决办法
  16. 情景式领导力学习(1) - 介绍
  17. PCL读取带rgb信息的asc文件C++
  18. 用html中表单标签实现QQ登录注册静态页面
  19. ZZULIOJ1194: 总成绩排序(结构体专题)
  20. IOS版aplayer使用教程_Y Y的使用教程视频版/图片版(手机版。电脑版。楚恒上课必用软件)...

热门文章

  1. 查询计算机系的所有教师,用sql查询所有计算机系的教师编号和姓名
  2. 2008引导修复 鼠标键盘用不了_这5个提高键盘鼠标生产力的工具,后悔没早点发现!...
  3. MATLAB基本运算
  4. mysql -a_a|MySQL基础命令
  5. 系统学习NLP(二十八)--GPT
  6. 人脸对齐(九)--SDM算法
  7. dell4528s linux_如何在戴尔PC上使用Ubuntu Linux终端
  8. 什么情况下java会出现堆溢出_【Java面试题第三期】JVM中哪些地方会出现内存溢出?出现的原因是什么?...
  9. python输入一个字母标识符_Python基础入门语法和变量类型(一)
  10. 【数据库原理实验(openGauss)】视图