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 mssql 日期出现中文字符的解决方法
Mar 10 PHP
支持中文字母数字、自定义字体php验证码代码
Feb 27 PHP
有关PHP性能优化的介绍
Jun 20 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
PHP实现从远程下载文件的方法
Mar 12 PHP
php实现简易聊天室应用代码
Sep 23 PHP
php实现点击可刷新验证码
Nov 07 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
Jun 13 PHP
php基于PDO实现功能强大的MYSQL封装类实例
Feb 27 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
laravel-admin自动生成模块,及相关基础配置方法
Oct 08 PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 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设计模式 Mediator (中介者模式)
2011/06/26 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
JS中Location使用详解
2015/05/12 Javascript
javascript数组去重小结
2016/03/07 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
Python使用django获取用户IP地址的方法
2015/05/11 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
简单介绍django提供的加密算法
2019/12/18 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
什么是Python包的循环导入
2020/09/08 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
共产党员公开承诺书
2014/03/25 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
病房管理制度范本
2015/08/06 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
财产分割协议书
2016/03/22 职场文书