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 相关文章推荐
Windows下PHP的任意文件执行漏洞
Oct 09 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
PHP+Javascript实现在线拍照功能实例
Jul 18 PHP
php实现过滤字符串中的中文和数字实例
Jul 29 PHP
PHP使用内置函数生成图片的方法详解
May 09 PHP
自制PHP框架之设计模式
May 07 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
Feb 25 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 PHP
laravel框架创建授权策略实例分析
Nov 22 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字符串截取问题
2006/11/28 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
AngularJS基础知识
2014/12/21 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
webpack多页面开发实践
2017/12/18 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
关于保护环境的建议书
2014/05/13 职场文书
火箭队口号
2014/06/18 职场文书
社会工作专业自荐信
2014/09/26 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
新闻通讯稿模板
2015/07/22 职场文书
如何使用SQL Server语句创建表
2022/04/12 SQL Server