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+mysql实现无限级分类 | 树型显示分类关系
Nov 19 PHP
php 计算两个时间戳相隔的时间的函数(小时)
Dec 18 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
php-fpm配置详解
Feb 12 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
PHP统计当前在线用户数实例讲解
Oct 21 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
Jun 06 PHP
阿里云的WindowsServer2016上部署php+apache
Jul 17 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 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设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
python实现list由于numpy array的转换
2018/04/04 Python
关于Python作用域自学总结
2019/06/10 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
python实现加密的方式总结
2020/01/19 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
Python自动登录QQ的实现示例
2020/08/28 Python
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
商业活动邀请函
2014/02/04 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
服务承诺书怎么写
2014/05/24 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
一文搞懂Java中的注解和反射
2022/06/21 Java/Android