学习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 相关文章推荐
Smarty模板快速入门
Jan 04 PHP
php下用GD生成生成缩略图的两个选择和区别
Apr 17 PHP
php数组总结篇(一)
Sep 30 PHP
smarty的保留变量问题
Oct 23 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
Feb 16 PHP
php iconv() : Detected an illegal character in input string
Dec 05 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 PHP
PHP PDOStatement::execute讲解
Jan 31 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+MYSQL开发工具及资源收藏
2007/01/02 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
原生js实现弹窗消息动画
2020/11/20 Javascript
js实现筛选功能
2020/11/24 Javascript
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
招聘与培训专员岗位职责
2014/01/30 职场文书
招聘专员岗位职责
2014/03/07 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
党支部承诺书范文
2014/03/28 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
网络舆情信息简报
2015/07/21 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
深入理解python协程
2021/06/15 Python
MySQL数据库表约束讲解
2022/06/21 MySQL