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

<?php
Function Operation($val1, $val2, $operate) { Switch($operate) {
Case ‘+’ : $result = $val1+$val2;
Break;
Case ‘-’ : $result = $val1-$val2;
Break;
Case ‘*’ : $result = $val1*$val2;
Break;
Case ‘/’ : $result = $val1/$val2;
Break;
}
Return $result;
}

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

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

<?php
/*定义接口类*/
Interface Operate {
function get_Value($val1, $val2); //此方法必须实现
} /*加法类*/
Class Operate_Add implements Operate {
public function get_Value($val1, $val2) {
return $val1 + $val2;
}
} /*减法类*/
Class Operate_Sub implements Operate {
public function get_Value($val1, $val2) {
return $val1 - $val2;
}
} /*乘法类*/
Class Operate_Multiply implements Operate {
public function get_Value($val1, $val2) {
return $val1 * $val2;
}
} /*除法类*/
Class Operate_Divide implements Operate {
public function get_Value($val1, $val2) {
return $val1 / $val2;
}
} 使用工厂,定义工厂类
Class Factory {
public static function Create_Operation($operate) {
Switch($operate) {
Case '+': return new Operate_Add;
break; Case '-': return new Operate_Sub;
break; Case '*': return new Operate_Multiply;
break; Case '/': return new Operate_Divide;
break;
} }
} $mys = Factory:: Create_Operation ('+');
$result = $mys ->get_Value(1, 2);

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

/*求余类*/
Class Operate_Remain implements Operate {
public function get_Value($val1, $val2) {
return $val1 % $val2;
}
}

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

Class Factory {
Public function Create_Operation($operate) {
Switch($operate) {
Case ‘+’: return new Operate_Add;
break;
}
Switch($operate) {
Case ‘-’: return new Operate_Sub;
break;
}
Switch($operate) {
Case ‘*’: return new Operate_ Multiply;
break;
}
Switch($operate) {
Case ‘/’: return new Operate_ Divide;
break;
}
Switch($operate) {
Case ‘%’: return new Operate_ Remain;
break;
}
}
}

看了这么多代码,其实说白了就一个道理:根据接收的条件,选择合适的类
这种方法与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. java中Statement详细用法。

    1.创建 Statement 对象 建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句.Statement 对象用 Connection 的方法createStatement 创建,如下列代 ...

  2. MySQL的语法高级之SELECT

    1.语法:select 字段列表 from  子句 [where 子句][group by 子句][ order by 子句][having 子句][limit 子句]; 注解: 1.where子句对 ...

  3. 【穿插】Python基础之文件、文件夹的创建,对上一期代码进行优化

    在上一期妹子图的爬虫教程中,我们将图片都保存在了代码当前目录下,这样并不便于浏览,我们应该将同一个模特的图片都放在一个文件夹中. 今天我们就简单讲一下Python下如何创建文件.文件夹,今后就可以用上 ...

  4. spring cloud 微服务应用间通讯

    SpringCloud 应用间通信基于HTTP的Restful调用方式有两种,RestTemplate与Feign. 1.RestTemplate应用间通讯 通过 @LoadBalanced,可在re ...

  5. 解决IIS部署网站引用woff/woff2/svg字体报404错误

    一.问题 在IIS上部署网站,网页引用woff字体时,浏览器报“找不到woff.woff2字体”.“404”错误,不仅预设的字体加载不出来,还影响网页加载速度. 二.原因 IIS默认设置情况下不识别. ...

  6. 简单的 ajax demo

    2.最重要也是最核心的是要自己改下bootstrap-paginator.js源文件,如下: [javascript] view plain copy      function oneferRepo ...

  7. Springboot整合thymeleaf模板

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

  8. Python——用正则求时间差

    如有求时间差的需求,可直接套用此方法: import time true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d ...

  9. 常用算法及其Python实现

    冒泡排序 ​ def bubble_sort(li):    for i in range(len(li)-1): # i表示第几趟        for j in range(len(li)-i-1 ...

  10. cache与buffer的区别

    Cache vs Buffer 高速缓存和缓冲区 缓存区cache和缓冲区buffer都是临时存储区,但它们在许多方面有所不同.缓冲区buffer主要存在于RAM中,作为CPU暂时存储数据的区域,例如 ...