发表时间:2015-05-27来源:网络
前面我们介绍了简单工厂,今天我们继续学习另外一个工厂——工厂方法。
具体案例:请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.管理上的难度
假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。
下一篇:php实现四种基本排序算法
CI框架连接数据库配置操作以及多数据库操作
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
C语言关键字及其解释介绍 C语言32个关键字详解
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
PHP中的(++i)前缀自增 和 (i++)后缀自增
将视频设置为Android手机开机动画的教程
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
常用dos命令及语法
PHP中include和require区别之我见
优居优住房产中介app官方版(优居找房)下载v4.3.2 安卓最新版
107.07MB |生活服务
纷享销客app官方版(更名纷享销客CRM)下载v9.7.6 安卓最新版
172.08MB |商务办公
虹蚁智控最新版下载v1.5.2 安卓版
57.93MB |生活服务
中鸽网赛事直播平台下载v2.5.09 安卓版
57.66MB |系统工具
四川政务服务一体化平台手机版(更名为天府通办)下载v5.1.2 安卓最新版
154.15MB |生活服务
钢之梦最新版本下载v5.8.5 安卓官方版
27.92MB |生活服务
合气网app下载v3.3.20 安卓版
36.64MB |商务办公
雷克萨斯elexusclub下载v3.96 安卓版
163.87MB |系统工具
2014-09-05
2022-03-20
2022-03-21
2022-03-24
2014-09-05
2014-09-05
2015-07-05
2014-09-05
2022-03-21
2014-09-05