声明:本系列博客参考资料《大话设计模式》,作者程杰。

前面两节内容介绍了什么是设计模式以及六大原则,相信看完前两节内容大家对设计模式已经有了初步的认识,接下来说一下设计模式的分类。

一般将面向对象设计模式分为三类:创建型、结构型、行为型三种。

创建型:创建对象时,不再由我们直接实例化对象;而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能、更好的架构优势。创建型模式主要有简单工厂模式(并不是23种设计模式之一)、工厂方法、抽象工厂模式、单例模式、生成器模式、原型模式。

结构型:用于帮助将多个对象组织成更大的结构。结构型模式主要有适配器模式、桥接模式、组合器模式、装饰器模式、门面模式、亨元模式和代理模式。

行为型:用于帮助系统间各对象的通信,以及如何控制复杂系统中流程。行为型模式主要有命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板模式、访问者模式和职责链模式。

今天主要介绍创建型的第一种简单工厂模式。

注意:在阅读本系列博客的时候一定要有阅读UML类图、面向对象PHP编程基础。

简单工厂模式不属于23种常用面向对象设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。其实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

角色及职责:

工厂(SimpleFactory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

抽象产品(IProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

需求:根据提供相应的属性值由简单工厂创建具有相应特性的产品对象。

现根据以上UML类图编写如下PHP代码。

<?php
/*** Created by PhpStorm.* User: Jiang* Date: 2015/4/9* Time: 21:48*//**抽象产品角色* Interface IProduct   产品接口*/
interface IProduct
{/**X轴旋转* @return mixed*/function XRotate();/**Y轴旋转* @return mixed*/function YRotate();
}/**具体产品角色* Class XProduct        X轴旋转产品*/
class XProduct implements IProduct
{private $xMax=1;private $yMax=1;function __construct($xMax,$yMax){$this->xMax=$xMax;$this->yMax=1;}function XRotate(){echo "您好,我是X轴旋转产品,X轴转转转。。。。。。";}function YRotate(){echo "抱歉,我是X轴旋转产品,我没有Y轴。。。。。。";}
}/**具体产品角色* Class YProduct        Y轴旋转产品*/
class YProduct implements IProduct
{private $xMax=1;private $yMax=1;function __construct($xMax,$yMax){$this->xMax=1;$this->yMax=$yMax;}function XRotate(){echo "抱歉,我是Y轴旋转产品,我没有X轴。。。。。。";}function YRotate(){echo "您好,我是Y轴旋转产品,Y轴转转转。。。。。。";}
}/**具体产品角色* Class XYProduct        XY轴都可旋转产品*/
class XYProduct implements IProduct
{private $xMax=1;private $yMax=1;function __construct($xMax,$yMax){$this->xMax=$xMax;$this->yMax=$yMax;}function XRotate(){echo "您好,我是XY轴都可旋转产品,X轴转转转。。。。。。";}function YRotate(){echo "您好,我是XY轴都可旋转产品,Y轴转转转。。。。。。";}
}/**工厂角色* Class ProductFactory*/
class ProductFactory
{static function GetInstance($xMax,$yMax){if($xMax>1 && $yMax===1){return new XProduct($xMax,$yMax);}elseif($xMax===1 && $yMax>1){return new YProduct($xMax,$yMax);}elseif($xMax>1 && $yMax>1){return new XYProduct($xMax,$yMax);}else{return null;}}
}

测试代码:

<?php
/*** Created by PhpStorm.* User: Jiang* Date: 2015/4/9* Time: 21:54*/
require_once "./SimpleFactory/SimpleFactory.php";header("Content-Type:text/html;charset=utf-8");$pro=array();
$pro[]=ProductFactory::GetInstance(1,12);
$pro[]=ProductFactory::GetInstance(12,1);
$pro[]=ProductFactory::GetInstance(12,12);
$pro[]=ProductFactory::GetInstance(0,12);foreach($pro as $v)
{if($v){echo "<br/>";$v->XRotate();echo "<br/>";$v->YRotate();}else{echo "非法产品!<br/>";}echo "<hr/>";
}

用浏览器访问测试代码,我们可以发现创建的对象依次是YProduct,XProduct,XYProduct,null。简单工厂的核心代码在于工厂(ProductFactory)这个角色,这里根据传入的xMax与yMax值去创建不同的对象,这便是简单工厂的实质,而且我们在测试调用客户端根本不知道具体的产品类是什么样,这样就做到了调用与创建的分离。

简单工厂的优点:让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。

简单工厂的缺点:当产品修改时,工厂类也要做相应的修改,比如要增加一种操作类,如求M数的N次方,就得改case,修改原有类,违背了开放-封闭原则。

更多详情敬请关注我的视频课程:

PHP面向对象设计模式

PHP设计模式——简单工厂相关推荐

  1. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  2. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  3. 设计模式——简单工厂

    设计模式--简单工厂 工厂角色: package designpattern.creation.simplefactory;/** * 此处的工厂简单写成一个类,因为(简单工厂的工厂)不会有继承或拓展 ...

  4. Spring常用设计模式--简单工厂模式

    本专栏内容参考自:咕泡学院Tom老师的<Spring5核心原理与30个类手写实战>,仅作个人学习记录使用,如有侵权,联系速删. 工厂模式的由来:   在现实生活中我们都知道,原始社会自给自 ...

  5. 设计模式—简单工厂模式

    前言 简单工厂模式是一种比较容易理解的设计模式 简单工厂模式介绍 在设计模式中,简单工厂模式可以理解为负责生产对象的一个类,当使用new 关键字创建一个对象时,此时该类就依赖于这个对象,也就是他们间的 ...

  6. 设计模式 - 简单工厂模式

    文章目录 设计模式 - 简单工厂模式 1.意图 2.实例 1.创建颜色接口 - 定义生产的产品是什么 2.创建颜色枚举 - 定义生产哪些类型的产品 3.根据颜色枚举创建产品 - 根据产品清单生产产品 ...

  7. Android工厂设计模式(简单工厂,工厂方法,抽象工厂,BitmapFactory简单工厂分析,Retrofit抽象工厂分析)

    文章目录 创建型设计模式(简单工厂,工厂方法,抽象工厂) 一.简单工厂模式 引出简单工厂模式 二.工厂方法模式 三.抽象工厂模式 Android源码中用到的工厂模式举例 一.BitmapFactory ...

  8. 设计模式--简单工厂(Factory)模式

    温故而知新,看了以前写的博文<Asp.net读取Excel文件 2>http://www.cnblogs.com/insus/archive/2011/05/05/2037808.html ...

  9. 设计模式--简单工厂模式

    什么是工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对 ...

  10. C#设计模式--简单工厂模式

    设计模式: 简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,下面简单举例说明: 简单工厂 ...

最新文章

  1. UVA 311 Packets
  2. 【SeaJS】【3】seajs.data相关的源码阅读
  3. 基于Python下的Apriltag检测
  4. 指针不显示 upupw_Go高级编程:指针和内存分配详解
  5. Faster-RCNN的一些记录。
  6. css 样式通用样式
  7. python 登陆微博 被删除 token_爬取微博信息,使用了cookie仍然无法登录微博
  8. html加拼音注释,满江红岳飞全文带拼音(注释+译文)
  9. 今天,给大家推荐一下我的好友:爱迪生
  10. HDU 3954 level up 线段树
  11. linux创建文档并且打字,与 Linux 一起学习:学习打字
  12. 房产管理系统有哪些领先技术的应用?
  13. EC智能电池信息读取
  14. MindManager:将excel转成思维导图
  15. 弘辽科技:淘宝狂欢大促怎么取消?要怎么做活动?
  16. 抖音将来会做电商小程序
  17. linux 目录中的文件和子目录生成jar包文件的方法
  18. 考研政治:马克思主义基本原理
  19. 看透这些才能赢,句句经典
  20. com.alibaba.otter.canal.protocol.exception.CanalClientException

热门文章

  1. PHP字符串转数字面试,浅谈php字符串反转 面试中经常遇到的问题
  2. tkinter 中给某个文本加上滚动条_Python Tkinter自制文本编辑器
  3. 标记偏置 隐马尔科夫 最大熵马尔科夫 HMM MEMM
  4. osea/ introduction
  5. 高中信息技术—Python常见关键字及函数中英文对照
  6. Win10下VB6.0开发之串口通信基础(一)控件属性篇
  7. 局域网访问虚拟机服务器桥接,虚拟机让局域网访问的方法---桥接模式
  8. html菜鸟ruby,ruby的基础语法
  9. 计算机图形学用到哪些概率知识,图形学所需的数学知识
  10. linux系统交换空间,Linux中如何使用和管理交换空间