学习php设计模式 php实现抽象工厂模式


Posted in PHP onDecember 07, 2015

抽象工厂模式(Abstact Factory)是一种常见的软件设计模式。该模式为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个具体的工厂类。
一、意图
抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类【GOF95】
二、抽象工厂模式结构图

学习php设计模式 php实现抽象工厂模式 

三、抽象工厂模式中主要角色
抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口。通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。
具体工厂(Concrete Factory)角色:实现创建产品对象的操作。客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。
抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。其内部包含了应用程序的业务逻辑。
四、抽象工厂模式的优缺点
抽象工厂模式的优点:
1、分离了具体的类
2、使增加或替换产品族变得容易
3、有利于产品的一致性
抽象工厂模式的缺点: 难以支持新种类的产品。这是因为AbstractFactory接口确定了可以被创建的产品集合。支持新各类的产品就需要扩展访工厂接口,从而导致AbstractFactory类及其所有子类的改变。
抽象工厂就是以一种倾斜的方式支持增加新的产品中,它为新产品族的增加提供了方便,而不能为新的产品等级结构的增加提供这样的方便。
五、抽象工厂模式适用场景
以下情况应当使用抽象工厂模式:
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2、这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
3、 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使用客户端不依赖于实现
六、抽象工厂模式与其它模式
单例模式(singleton模式):具体工厂类可以设计成单例类,由于工厂通常有一个就可以,因此具体工厂子类一般都实现为一个Singleton。
工厂方法模式(factory method模式):抽象工厂创建产品的方法定义为工厂方法。
原型模式(prototype模式):如果有多个可能的产品系列,具体的工厂也可以使用原型模式,具体工厂使用产品系列中
每一个产品的原型进行实例化并且通过复制它的原型来创建新的产品。
七、抽象工厂模式PHP示例

<?php
/**
 * 抽象工厂
 */
interface AbstractFactory {
 /**
 * 创建等级结构为A的产品的工厂方法
 */
 public function createProductA();
 
 /**
 * 创建等级结构为B的产品的工厂方法
 */
 public function createProductB();
 
}
 
/**
 * 具体工厂1
 */
class ConcreteFactory1 implements AbstractFactory{
 
 public function createProductA() {
 return new ProductA1();
 }
 
 public function createProductB() {
 return new ProductB1();
 }
}
 
 
/**
 * 具体工厂2
 */
class ConcreteFactory2 implements AbstractFactory{
 
 public function createProductA() {
 return new ProductA2();
 }
 
 public function createProductB() {
 return new ProductB2();
 }
}
 
/**
 * 抽象产品A
 */
interface AbstractProductA {
 
 /**
 * 取得产品名
 */
 public function getName();
}
 
/**
 * 抽象产品B
 */
interface AbstractProductB {
 
 /**
 * 取得产品名
 */
 public function getName();
}
 
/**
 * 具体产品A1
 */
class ProductA1 implements AbstractProductA {
 private $_name;
 
 public function __construct() {
 $this->_name = 'product A1';
 }
 
 public function getName() {
 return $this->_name;
 }
}
 
 
/**
 * 具体产品A2
 */
class ProductA2 implements AbstractProductA {
 private $_name;
 
 public function __construct() {
 $this->_name = 'product A2';
 }
 
 public function getName() {
 return $this->_name;
 }
}
 
 
/**
 * 具体产品B1
 */
class ProductB1 implements AbstractProductB {
 private $_name;
 
 public function __construct() {
 $this->_name = 'product B1';
 }
 
 public function getName() {
 return $this->_name;
 }
}
 
/**
 * 具体产品B2
 */
class ProductB2 implements AbstractProductB {
 private $_name;
 
 public function __construct() {
 $this->_name = 'product B2';
 }
 
 public function getName() {
 return $this->_name;
 }
}
 
 
/**
 * 客户端
 */
class Client {
 
 /**
 * Main program.
 */
 public static function main() {
 self::run(new ConcreteFactory1());
 self::run(new ConcreteFactory2());
 }
 
 /**
 * 调用工厂实例生成产品,输出产品名
 * @param $factory AbstractFactory 工厂实例
 */
 public static function run(AbstractFactory $factory) {
 $productA = $factory->createProductA();
 $productB = $factory->createProductB();
 echo $productA->getName(), '<br />';
 echo $productB->getName(), '<br />';
 }
 
}
 
Client::main();
?>

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

PHP 相关文章推荐
php入门学习知识点五 关于php数组的几个基本操作
Jul 14 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
通过dbi使用perl连接mysql数据库的方法
Apr 16 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
Apr 21 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
PHP实现扎金花游戏之大小比赛的方法
Mar 10 PHP
php线性表的入栈与出栈实例分析
Jun 12 PHP
PHP 7.0.2 正式版发布
Jan 08 PHP
php从身份证获取性别和出生年月
Feb 09 PHP
PHP框架自动加载类文件原理详解
Jun 06 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
Jun 06 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 #PHP
学习php设计模式 php实现建造者模式
Dec 07 #PHP
学习php设计模式 php实现访问者模式(Visitor)
Dec 07 #PHP
PHP面向对象详解(三)
Dec 07 #PHP
php生成高清缩略图实例详解
Dec 07 #PHP
php冒泡排序与快速排序实例详解
Dec 07 #PHP
PHP常用工具类大全附全部代码下载
Dec 07 #PHP
You might like
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
thinkphp中的url跳转用法分析
2016/07/12 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
python中list常用操作实例详解
2015/06/03 Python
Python 的内置字符串方法小结
2016/03/15 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
大数据分析用java还是Python
2020/07/06 Python
Python random模块的使用示例
2020/10/10 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
物流毕业生个人的自我评价
2014/02/13 职场文书
婚礼父母致辞
2015/07/28 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏
vue的项目如何打包上线
2022/04/13 Vue.js
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL