PHP设计模式之抽象工厂模式实例分析


Posted in PHP onMarch 25, 2019

本文实例讲述了PHP设计模式之抽象工厂模式。分享给大家供大家参考,具体如下:

前面的文章说了PHP下的简单工厂(静态工厂) 和工厂模式,现在说一下抽象工厂模式

工厂模式我们已经说过,增加一个产品很简单,增加对应的产品类和工厂类,不需要对原有代码进行改动,符合开闭原则

现在接着上篇文章,我们又有了新的需求,我们要求苹果味饮料和香蕉味饮料,有百事和可口可乐两个品牌,用工厂模式,就实现不了了,我只能增加单一的产品,但是增加品牌我实现不了,引申而出抽象工厂模式,代码如下

<?php
/**
 * Created by PhpStorm.
 * User: tiansi
 * Date: 18/1/23
 * Time: 下午5:10
 */
//工厂接口
interface FruitFactory{
  //生产饮料方法
  function makeAppleFruit();
  function makeBananaFruit();
}
//饮料接口
interface Fruit{
  function getFruitName();
}
class BaishiAppleFruit implements Fruit{
  function getFruitName()
  {
    echo '百事苹果味饮料';
  }
}
class BaishiBananaFruit implements Fruit{
  function getFruitName()
  {
    echo '百事香蕉味饮料';
  }
}
class ColeiAppleFruit implements Fruit{
  function getFruitName()
  {
    echo '可口可乐苹果味饮料';
  }
}
class ColeBananaFruit implements Fruit{
  function getFruitName()
  {
    echo '可口可乐香蕉味饮料';
  }
}
//百事饮料工厂
class BaishiFruitFactory implements FruitFactory{
  function makeAppleFruit()
  {
    //生产百事苹果饮料
    return new BaishiAppleFruit();
  }
  function makeBananaFruit()
  {
    //生产百事香蕉饮料
    return new BaishiBananaFruit();
  }
}
//可口可乐饮料工厂
class ColeFruitFactory implements FruitFactory{
  function makeAppleFruit()
  {
    //生产可口可乐苹果饮料
    return new ColeiAppleFruit();
  }
  function makeBananaFruit()
  {
    //生产可口可乐香蕉味饮料
    return new ColeBananaFruit();
  }
}
$baishi_factory = new BaishiFruitFactory();
$baishi_factory->makeAppleFruit()->getFruitName();
echo "<br/>";
$baishi_factory->makeBananaFruit()->getFruitName();
echo "<br/>";
$cole_factory = new ColeFruitFactory();
$cole_factory->makeAppleFruit()->getFruitName();
echo "<br/>";
$cole_factory->makeBananaFruit()->getFruitName();

运行结果:

百事苹果味饮料
百事香蕉味饮料
可口可乐苹果味饮料
可口可乐香蕉味饮料

现在我们可以看到 如果想要再增加一个品牌的话 只需要再写一个工厂类 并写上对应的产品类 就可以在不改动原有代码的前提下 成功增加品牌

但是这会儿想要再增加一个单一产品,就很麻烦了,需要更改工厂类,这就是工厂和抽象工厂的区别

工厂模式针对于单一产品,一个产品抽象类,每个工厂只能创建一个产品,支持扩展单个产品,不支持扩展产品族,针对一个产品等级结构

抽象工厂针对于产品族,多个产品抽象类,每个工厂能创建多个产品,支持扩展产品族,不支持扩展单个产品,针对多个产品等级结构

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
以文本方式上传二进制文件的PHP程序
Oct 09 PHP
一个好用的分页函数
Nov 16 PHP
PHP APC的安装与使用详解
Jun 13 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
PHP中foreach()用法汇总
Jul 02 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
PHP的Yii框架中View视图的使用进阶
Mar 29 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
总结PHP内存释放以及垃圾回收
Mar 29 PHP
php识别翻转iphone拍摄的颠倒图片
May 17 PHP
safari下载文件自动加了html后缀问题
Nov 09 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 #PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 #PHP
详解PHP神奇又有用的Trait
Mar 25 #PHP
PHP自动载入类文件函数__autoload的使用方法
Mar 25 #PHP
PHP生成短网址的思路以及实现方法的详解
Mar 25 #PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 #PHP
mongodb和php的用法详解
Mar 25 #PHP
You might like
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
JavaScript 事件记录使用说明
2009/10/20 Javascript
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
Python 字符串定义
2009/09/25 Python
python实现提取百度搜索结果的方法
2015/05/19 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python字符串处理实现单词反转
2017/06/14 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
python set集合使用方法解析
2019/11/05 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
2014迎接教师节演讲稿
2014/09/10 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
学生犯错保证书
2015/05/09 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript