假设有一道编程题:输入两个数字和运算符,然后得到运算结果。非常简单的一道题目,通常的实现代码如下:

  1. <?php
  2. Function Operation($val1, $val2, $operate) {
  3.  
  4. Switch($operate) {
  5. Case ‘+’ : $result = $val1+$val2;
  6. Break;
  7. Case ‘-’ : $result = $val1-$val2;
  8. Break;
  9. Case ‘*’ : $result = $val1*$val2;
  10. Break;
  11. Case ‘/’ : $result = $val1/$val2;
  12. Break;
  13. }
  14. Return $result;
  15. }

上述代码,乍一看还是不错的,采用了分支结构,简洁明了,对于一般的小型应用足够了。当我们要增加一个运算符时,需要再次修改上述主体代码。有没有办法再不修改主体代码的情况下,而实现功能改变了?

通过面向对象的思想,通过封装、继承、多态将程序的耦合性降到最低。
简单工厂模式

  1. <?php
  2. /*定义接口类*/
  3. Interface Operate {
  4. function get_Value($val1, $val2); //此方法必须实现
  5. }
  6.  
  7. /*加法类*/
  8. Class Operate_Add implements Operate {
  9. public function get_Value($val1, $val2) {
  10. return $val1 + $val2;
  11. }
  12. }
  13.  
  14. /*减法类*/
  15. Class Operate_Sub implements Operate {
  16. public function get_Value($val1, $val2) {
  17. return $val1 - $val2;
  18. }
  19. }
  20.  
  21. /*乘法类*/
  22. Class Operate_Multiply implements Operate {
  23. public function get_Value($val1, $val2) {
  24. return $val1 * $val2;
  25. }
  26. }
  27.  
  28. /*除法类*/
  29. Class Operate_Divide implements Operate {
  30. public function get_Value($val1, $val2) {
  31. return $val1 / $val2;
  32. }
  33. }
  34.  
  35. 使用工厂,定义工厂类
  36. Class Factory {
  37. public static function Create_Operation($operate) {
  38. Switch($operate) {
  39. Case '+': return new Operate_Add;
  40. break;
  41.  
  42. Case '-': return new Operate_Sub;
  43. break;
  44.  
  45. Case '*': return new Operate_Multiply;
  46. break;
  47.  
  48. Case '/': return new Operate_Divide;
  49. break;
  50. }
  51.  
  52. }
  53. }
  54.  
  55. $mys = Factory:: Create_Operation ('+');
  56. $result = $mys ->get_Value(1, 2);

当我们要增加一个求余的算法时,只需要增加一个求余类:

  1. /*求余类*/
  2. Class Operate_Remain implements Operate {
  3. public function get_Value($val1, $val2) {
  4. return $val1 % $val2;
  5. }
  6. }

修改工厂类即可,而无法修改具体的实现代码:

  1. Class Factory {
  2. Public function Create_Operation($operate) {
  3. Switch($operate) {
  4. Case ‘+’: return new Operate_Add;
  5. break;
  6. }
  7. Switch($operate) {
  8. Case ‘-’: return new Operate_Sub;
  9. break;
  10. }
  11. Switch($operate) {
  12. Case ‘*’: return new Operate_ Multiply;
  13. break;
  14. }
  15. Switch($operate) {
  16. Case ‘/’: return new Operate_ Divide;
  17. break;
  18. }
  19. Switch($operate) {
  20. Case ‘%’: return new Operate_ Remain;
  21. break;
  22. }
  23. }
  24. }

看了这么多代码,其实说白了就一个道理:根据接收的条件,选择合适的类
这种方法与PHP web开发中MVC模式十分类似:根据URI参数,选择不同的控制器类和实现方法。
其实在PHP数据库设计时也可用到工厂模式,根据不同的参数,选择不同的数据库类。

大话设计模式之PHP篇 - 简单工厂模式的更多相关文章

  1. &lt;一&gt;读&lt;&lt;大话设计模式&gt;&gt;之简单工厂模式

    工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...

  2. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  3. C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...

  4. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  5. C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式

    1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...

  6. 设计模式(二)简单工厂模式(Simple Factory Pattern)

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

  7. Unity C# 设计模式(二)简单工厂模式

    定义: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 ...

  8. Java设计模式(三)简单工厂模式

    定义与类型 定义:由一个工厂对象决定创建出哪一种产品类的实例 类型:创建型,但不属于GOF23种设计模式 适用场景 工厂类负责创建的对象比较少 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象 ...

  9. PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)

    最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...

随机推荐

  1. 浅谈DNS

    什么叫域名解析 域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站一种服务.IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址.域名解析就是域 ...

  2. Python简单的线程池

    class ThreadPool(object): def __init__(self, max_num=20): # 创建一个队列,队列里最多只能有10个数据 self.queue = queue. ...

  3. 封装AFNetworking

    用了一下AFNetworking感觉比ASIHttprequest 真心好用一些,因为我还是个初学者吧,很多ASIHttprequest 的功能还没有用到,与ASIHttprequest 不用的是AF ...

  4. Toeplitz matrix

    w https://en.wikipedia.org/wiki/Toeplitz_matrix Proof of Stolz-Cesaro theorem | planetmath.org  http ...

  5. Springboot整合thymeleaf模板

    Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用. Thymeleaf的主要目标在于提供一种可被浏览器正确显示的.格式良好的模板创建方式,因此也可以用作静态建 ...

  6. [NOIP2018PJ]对称二叉树

    [NOIP2018PJ]对称二叉树 这个题正常人看到题面难道不是哈希? 乱写了个树哈希... #include<bits/stdc++.h> using namespace std; co ...

  7. Datetime 模块求日期差

    Datetime 模块求日期差 导入 datetime 模块/实例化当前时间对象 调用.date() 方法 得到当前年/月/日时间 实例化时间差对象 delta 求当前日期减去时间差 delta 后的 ...

  8. Django 进阶(分页器&中间件)

    分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views h ...

  9. 生产者,消费者,CDN

    1 生产者消费者模型应用场景及优势? 什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进 ...

  10. Android系统移植与调试之------->如何修改Android的默认语言、默认时区

    修改device/other/TBDG1073/ system.prop文件 1.设置默认语言 找到device/other/TBDG1073/ system.prop文件,修改属性ro.produc ...