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 相关文章推荐
MySQL相关说明
Jan 15 PHP
PHP防注入安全代码
Apr 09 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
理解和运用PHP中的多态性[译]
Aug 02 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
Jun 28 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
php实现将上传word文件转为html的方法
Jun 03 PHP
PHP mysql事务问题实例分析
Jan 18 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
Nov 15 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
Oct 24 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语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
yii分页组件用法实例分析
2015/12/28 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
js算法中的排序、数组去重详细概述
2013/10/14 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
Python使用matplotlib绘制动画的方法
2015/05/20 Python
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
监理员的岗位职责
2013/11/13 职场文书
校园活动宣传方案
2014/03/28 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
会计工作态度自我评价
2015/03/06 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android