学习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
Nov 25 PHP
php学习笔记 数组遍历实现代码
Jun 09 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
Jun 18 PHP
深入理解PHP中的Session和Cookie
Jun 21 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Dec 01 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
Mar 15 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
php快速排序原理与实现方法分析
May 26 PHP
PHP中include/require/include_once/require_once使用心得
Aug 28 PHP
PHP生成随机字符串实例代码(字母+数字)
Sep 11 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
php 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
Node学习记录之cluster模块
2017/05/31 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
Python 开发Activex组件方法
2009/11/08 Python
详解Python中的strftime()方法的使用
2015/05/22 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
宿舍违规检讨书
2014/01/12 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
物流业务员岗位职责
2015/04/03 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android
MySQL 数据库范式化设计理论
2022/04/22 MySQL