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
数据库查询记录php 多行多列显示
Aug 15 PHP
完美实现GIF动画缩略图的php代码
Jan 02 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
你可能不知道PHP get_meta_tags()函数
May 12 PHP
Linux下手动编译安装PHP扩展的例子分享
Jul 15 PHP
Smarty模板变量调节器用法分析
May 23 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 PHP
php与阿里云短信接口接入操作案例分析
May 27 PHP
PHP终止脚本运行三种实现方法详解
Sep 01 PHP
PHP如何通过date() 函数格式化显示时间
Nov 13 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
一个简洁的多级别论坛
2006/10/09 PHP
php环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
跟我学Laravel之配置Laravel
2014/10/15 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
简单的分页代码js实现
2016/05/17 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
Python中splitlines()方法的使用简介
2015/05/20 Python
解决python3中解压zip文件是文件名乱码的问题
2018/03/22 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
python中round函数保留两位小数的方法
2020/12/04 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
面试求职的个人自我评价
2013/11/16 职场文书
就职演讲稿范文
2014/05/19 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers