学习php设计模式 php实现工厂模式(factory)


Posted in PHP onDecember 07, 2015

一、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使用一个类的实例化延迟到其子类【GOF95】
二、工厂模式结构图

学习php设计模式 php实现工厂模式(factory)

三、工厂模式中主要角色
抽象产品(Product)角色:具体产品对象共有的父类或接口
具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,并且工厂方法模式所创建的每一个对象都是某具体产品对象的实例
抽象工厂(Creator)角色:模式中任何创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Product类型的对象。
Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的的ConcreteProduct对象
具体工厂(Concrete Creator)角色:实现抽象工厂接口,具体工厂角色与应用逻辑相关,由应用程序直接调用以创建产品对象。
四、工厂模式的优点和缺点
工厂模式的优点:
工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
工厂模式的缺点:
客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类
五、工厂模式适用场景
1、当一个类不知道它所必须创建的对象的类的时候
2、当一个类希望由它的子类来指定它所创建的对象的时候
3、当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
六、工厂模式与其它模式
抽象工厂模式(abstract factory模式):Abstract Factory模式经常使用工厂方法来实现
Template Method模式: 工厂方法通常在Template Methods中被调用
七、工厂模式PHP示例

<?php
/**
 * 抽象工厂角色
 */
interface Creator {
 public function factoryMethod();
}
 
/**
 * 具体工厂角色A
 */
class ConcreteCreatorA implements Creator {
 
 /**
 * 工厂方法 返回具体 产品A
 * @return ConcreteProductA
 */
 public function factoryMethod() {
 return new ConcreteProductA();
 }
}
 
/**
 * 具体工厂角色B
 */
class ConcreteCreatorB implements Creator {
 
 /**
 * 工厂方法 返回具体 产品B
 * @return ConcreteProductB
 */
 public function factoryMethod() {
 return new ConcreteProductB();
 }
}
 
/**
 * 抽象产品角色
 */
interface Product {
 public function operation();           
}
 
/**
 * 具体产品角色A
 */
class ConcreteProductA implements Product {
 
 /**
 * 接口方法实现 输出特定字符串
 */
 public function operation() {
 echo 'ConcreteProductA <br />';
 }
}
 
/**
 * 具体产品角色B
 */
class ConcreteProductB implements Product {
 
 /**
 * 接口方法实现 输出特定字符串
 */
 public function operation() {
 echo 'ConcreteProductB <br />';
 }
}
 
class Client {
 
 /**
 * Main program.
 */
 public static function main() {
 $creatorA = new ConcreteCreatorA();
 $productA = $creatorA->factoryMethod();
 $productA->operation();
 
 $creatorB = new ConcreteCreatorB();
 $productB = $creatorB->factoryMethod();
 $productB->operation();
 }
 
}
 
Client::main();
?>

八、区分工厂方法模式与简单工厂模式
工厂方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了”开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
工厂方法模式退化后可以演变成简单工厂模式。

以上就是使用php实现工厂模式的代码,还有一些关于工厂模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP.MVC的模板标签系统(一)
Sep 05 PHP
附件名前加网站名
Mar 23 PHP
php绝对路径与相对路径之间关系的的分析
Mar 03 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
Jan 13 PHP
php使用百度天气接口示例
Apr 22 PHP
关于php支持分块与断点续传文件下载功能代码
May 09 PHP
分享PHP函数实现数字与文字分页代码
Jul 28 PHP
简单了解PHP编程中数组的指针的使用
Nov 30 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 #PHP
PHP中Enum(枚举)用法实例详解
Dec 07 #PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 #PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 #PHP
php实现smarty模板无限极分类的方法
Dec 07 #PHP
学习php设计模式 php实现单例模式(singleton)
Dec 07 #PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 #PHP
You might like
php变量范围介绍
2012/10/15 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
PHP连接access数据库
2015/03/27 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
js tab效果的实现代码
2009/12/26 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
使用jquery实现放大镜效果
2014/09/02 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
全面解析标签页的切换方式
2016/08/21 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
详解vue项目首页加载速度优化
2017/10/18 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
Python subprocess模块学习总结
2014/03/13 Python
python读取文本中的坐标方法
2018/10/14 Python
详解python中init方法和随机数方法
2019/03/13 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
网上签名寄语活动留言
2014/01/18 职场文书
亮剑精神观后感
2015/06/05 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers