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
一个用于网络的工具函数库
Oct 09 PHP
php检测文件编码的方法示例
Apr 25 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
May 08 PHP
php简单分页类实现方法
Feb 26 PHP
PHP中返回引用类型的方法
Apr 03 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
php微信公众号开发(3)php实现简单微信文本通讯
Dec 15 PHP
PHP实现接收二进制流转换成图片的方法
Jan 10 PHP
php中的buffer缓冲区用法分析
May 31 PHP
Laravel框架中集成MongoDB和使用详解
Oct 17 PHP
PHP常用函数之base64图片上传功能详解
Oct 21 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
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
js类 from qq
2006/11/13 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
vue2.0 路由模式mode=&quot;history&quot;的作用
2018/10/18 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
python解析模块(ConfigParser)使用方法
2013/12/10 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python入门必须知道的11个知识点
2018/03/21 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
python逆序打印各位数字的方法
2018/06/25 Python
Python异常处理操作实例详解
2018/08/28 Python
Python函数和模块的使用总结
2019/05/20 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
空中乘务员岗位职责
2014/03/08 职场文书
公司联欢会策划方案
2014/05/19 职场文书
食品安全承诺书
2014/05/22 职场文书
大学生实习证明范本
2014/09/19 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
详解NodeJS模块化
2021/06/15 NodeJs
python中对列表的删除和添加方法详解
2022/02/24 Python