PHP设计模式之简单工厂模式

先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式。毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式。在GoF设计模式中也都是属于创建型的模式。

但是,能够说明白简单工厂工厂模式抽象工厂模式这三种模式的人还真能让面试官刮目相看。这里有个前提,是你真的能说明白,大部分人,包括在深入研究设计模式之前,我也没办法说清楚。不管是我去面试,还是面试其别人。当我面试别人的时候,能讲个大概也就差不多了。而我去面试的时候,也就是类似的讲个大概。经历不少挫折之后才有了想深入的研究研究设计模式的想法,于是便会产生这一系列的文章。从这篇简单工厂开始,我们一起再次深入的对设计模式进行学习。

当然,这里用的是PHP。

解释

简单工厂,也称静态工厂,不属于GoF23种设计模式。但是可以说是所有的设计模式中大家可能最容易理解,也可能在你的代码中早就已经用过不知道多少次的一种设计模式了。我们先从一个最最简单的代码段来看。

// Factory
class Factory
{public static function createProduct(string $type) : Product{$product = null;switch ($type) {case 'A':$product = new ProductA();break;case 'B':$product = new ProductB();break;}return $product;}
}

没错,核心点就是中间那段简单的switch代码,我们在返回值类型中固定为Product接口的实现。

在这段代码中,使用了PHP新特性,参数类型返回值类型

产品接口和产品实现

// Products
interface Product
{public function show();
}class ProductA implements Product
{public function show(){echo 'Show ProductA';}
}class ProductB implements Product
{public function show(){echo 'Show ProductB';}
}

最后客户端的使用就很简单了

// Client
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
$productA->show();
$productB->show();

从以上代码可以看出,其实这里就是一个工厂类根据我们传入的字符串或者其他你自己定义的标识符,来返回对应的产品(Product对象)。

形象化一点的比喻:我是一个卖手机的批发商(客户Client,业务方),我需要一批手机(产品Product),于是我去让富士康(工厂Factory)来帮我生产。我下了订单($type变量)指明型号,然后富士康就给我对应型号的手机,然后我就继续我的工作了,和富士康的合作还真是挺愉快的。

这里比较规范的写法可能是所有产品都会去实现一个统一的接口,然后客户端只知道接口的方法统一调用即可。不规范的话也可以不使用接口,返回各种不同的对象,类似于外观(Facade)模式进行统一的门面管理。

源码地址:简单工厂基础类图实现

实例

场景:短信发送功能模块。现在我们使用了三个商家的,分别是阿里云、蝶信、极光的短信服务,在不同业务中可能使用不同的短信发送商,使用简单工厂可以方便的完成这个需求。

类图

代码

<?phpinterface Message {public function send(string $msg);
}class AliYunMessage implements Message{public function send(string $msg){// 调用接口,发送短信// xxxxxreturn '阿里云短信(原阿里大鱼)发送成功!短信内容:' . $msg;}
}class BaiduYunMessage implements Message{public function send(string $msg){// 调用接口,发送短信// xxxxxreturn '百度SMS短信发送成功!短信内容:' . $msg;}
}class JiguangMessage implements Message{public function send(string $msg){// 调用接口,发送短信// xxxxxreturn '极光短信发送成功!短信内容:' . $msg;}
}Class MessageFactory {public static function createFactory($type){switch($type){case 'Ali':return new AliYunMessage();case 'BD':return new BaiduYunMessage();case 'JG':return new JiguangMessage();default:return null;}}
}// 当前业务需要使用极光
$message = MessageFactory::createMessage('Ali');
echo $message->send('您有新的短消息,请查收');

源码地址:简单工厂实例-短信发送工厂

说明

  • createMessage一定要使用static?不一定,看自己业务情况决定,需要常驻的全部static,按需实例化的就new完了再正常->去调用
  • 三个message子类一定需要实现接口?也不一定,php本身就是弱类型语言,可以不去强制实现,但使用接口更加符合面向对象的规范(请参考多态),简单工厂本身其实是对多态的一种表述和应用
  • 当需要增加发送消息的渠道时,添加新类继承Message接口,实现send()方法,修改MessageFactory()中createFactory()方法里的switch
  • 思考上述修改违背了面向对象的什么原则?(提示:开放XX)
  • 实例中没有使用返回值类型?本身这也是新语法,对于老版本兼容来说可以不需要去写,但是如果公司技术栈已经升级到7以上的话,建议这种设计模式架构类的代码还是按照上方解释中的新特性写法去书写,也就是带上参数类型和返回值类型,更加的符合规范,也更容易理解
  • 实例中传错了$type返回NULL怎么办?亲,实际写代码的时候请处理好这个问题哟,返回一个默认的,或者上层捕获都是不错的解决方案,当然最好客户端那边提前判断好,没问题了再进工厂吧

下期看点

工厂方法模式,接着发短信,但这回我们让客户端换个姿势来发

php的类图怎么生成_PHP设计模式之简单工厂模式相关推荐

  1. php设计一个盒子类代码_PHP设计模式之简单工厂模式(Simple Factory)代码实例大全(七)...

    目的[1] 简单工厂模式是一个精简版的工厂模式. 它与静态工厂模式最大的区别是它不是『静态』的.因为非静态,所以你可以拥有多个不同参数的工厂,你可以为其创建子类.甚至可以模拟(Mock)它,这对编写可 ...

  2. 设计模式之简单工厂模式(Java 实现)

    设计模式之简单工厂模式(Java 实现) 本文首发于http://www.imooc.com/wiki/Designlesson/factory.html 简单工厂模式是平时开发过程中最常见的设计模式 ...

  3. C#设计模式(2)——简单工厂模式

    一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂 ...

  4. 工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)

    简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧.为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习. 1  场景问题 ...

  5. .NET设计模式(1): 简单工厂模式

    .NET设计模式(1): 简单工厂模式 最近一直在看设计模式,想把自己的学习笔记与大家分享一下,如果能帮助大家的话,我会非常高兴,同时也欢迎大家指出里面的不足.园子里其实关于此类文章已经很多了,如果d ...

  6. JS常用的设计模式(2)——简单工厂模式

    JS常用的设计模式(2)--简单工厂模式 简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定 ...

  7. c++设计模式之简单工厂模式

    模拟场景 要求使用简单工厂模式设计一个可以创建不同几何形状(如矩形.圆形.三角形)的绘图工具,每个几何图形都具有绘制Draw()和擦除Erase()两个方法: UML类图 分析需求: 首先这个绘图工具 ...

  8. 设计模式之简单工厂模式(C#版)

    设计模式之简单工厂模式(C#版) 简介 假设有个女朋友 总结 简介 我用最简洁而直接的方式来描述一下,什么是简单工厂模式.一句话就是,工厂类使用switch case语句返回特定类型. 下面,我们用一 ...

  9. 大牧絮叨设计模式:简单工厂模式

    文章目录 1. 简单工厂模式概述 1.1.简单工厂模式核心组件 1.2.简单工厂模式优缺点 2.` Java`实现 公共父类定义 产品具体实现类 简单工厂定义 代码运行测试: 3. `Python`实 ...

最新文章

  1. python获取数据库列名_python sqlite3 查询操作及获取对应查询结果的列名
  2. 2018python培训多年口碑_2018高考成绩不理想怎么办 学python前途无量
  3. Java设计模式(1)工厂模式(Factory模式)
  4. 一个列表包揽所有你需要的Windows应用
  5. abap 取日期最大_Pointer干货分享:SQL面试50题思路解答与分类整理(下)CASE与日期函数...
  6. HDU-2084(简单DP)
  7. Unity3D开发的赛车单机小游戏详细介绍(附有游戏下载链接)
  8. 牛客网暑期ACM多校训练营(第二场): H. travel(树形线头DP)
  9. C++ OpenCV光平面标定-线激光提取
  10. java实现马尔科夫链,马尔科夫链算法的JAVA实现
  11. 什么是二级域名,什么是二级目录?
  12. 创建AWS个人账户享用一年免费套餐
  13. Android怎么在Service中执行耗时操作
  14. OpenGL ES 实现瘦身大长腿效果
  15. 用Python学《微积分B》(Taylor公式与曲线拟合)
  16. Django邮件应用--QQ邮箱、网易邮箱(一)
  17. word2010添加论文引用
  18. APIAuto——敏捷开发最强大易用的 HTTP 接口工具 (二)
  19. 浅谈IT行业加班有没有价值
  20. Flutter - 记录遇到的一些问题

热门文章

  1. asp.net C# 时间格式大全
  2. gj4 深入类和对象
  3. 网络文件系统(samba、nfs、iscsi)
  4. mysql 一致性读_mysql/mariadb知识点总结(27):一致性读,快照读
  5. Linux系统TCP内核参数优化总结
  6. 关系型数据库,第一!
  7. Seata 1.4.0 重磅发布
  8. 阿里云李飞飞:传统数据库步履蹒跚,未来的机会在哪里?
  9. Java经典面试题整理及答案详解(八)
  10. 蚂蚁金服共享智能技术实践:如何降低数据共享的难度?