大话设计模式之PHP篇 - 简单工厂模式
假设有一道编程题:输入两个数字和运算符,然后得到运算结果。非常简单的一道题目,通常的实现代码如下:
<?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篇 - 简单工厂模式的更多相关文章
- <一>读<<大话设计模式>>之简单工厂模式
工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式
1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...
- 设计模式(二)简单工厂模式(Simple Factory Pattern)
一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...
- Unity C# 设计模式(二)简单工厂模式
定义: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 ...
- Java设计模式(三)简单工厂模式
定义与类型 定义:由一个工厂对象决定创建出哪一种产品类的实例 类型:创建型,但不属于GOF23种设计模式 适用场景 工厂类负责创建的对象比较少 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象 ...
- PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)
最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...
随机推荐
- java httpSession 设置超时时间
1.设置过期时间方式一:在tomcat/conf/web.xml下加入一下内容 <session-config> <session-timeout>90</session ...
- Type Group(类型组)
在 APAP 程序开发中, 经常需要定义一些常量或变量, 而且可能存在多个程序中需要用到的类似的变量或结构体, SAP 提供了类型组, 允许用户建立一些公用的对象, 允许在不同的程序中调用, 这样不但 ...
- php中使用curl来post一段json数据
场景:在调用第三方接口时经常需要使用到curl进行数据交互,在初次使用时遇到一些小问题,记录下来随时查阅. 封装curl相关方法便于使用,方法如下: /** * @param $url * @para ...
- 4、easyUI-七种布局(layout)
1.为网页创建边框布局 边框布局(border layout)提供五个区域:east.west.north.south.center.以下是一些通常用法: north 区域可以用来显示网站的标语. s ...
- 七牛上传ipa后自动生成plist文件
1.利用模板技术动态生成plist文件的内容:(模板内容和data替换为plist需要的内容) //artTemplate <script src="js/template.js&qu ...
- Oracle注入速查表
注:下面的一部分查询只能由admin执行,我会在查询的末尾以"-priv“标注. 探测版本: SELECT banner FROM v$version WHERE banner LIKE ‘ ...
- 49、android ListView几个比较特别的属性
由于这两天在做listView的东西,所以整理出来一些我个人认为比较特别的属性,通过设置这样的属性可以做出更加美观的列表 android:stackFromBottom="true" ...
- SharePoint让所有用户访问站点
SharePoint让所有用户访问站点,可用在用户组里面添加:NT AUTHORITY\authenticated users
- Power Systems 虚拟化简介
本文向您详细地介绍了 Power System 虚拟化相关的技术和亮点,让您对这些最新的虚拟化技术有一个全面的了解.本文来自 IBM Systems Magazine for AIX 中文版. 自从引 ...
- Elasticsearch之elasticsearch5.x 新特性
其实,elasticsearch5.x 和 elasticsearch2.x 并不区别很大. 是因为,ELK里之前版本各种很混乱,直接升级到5.0了. 其实,elasticsearch5.x 按理来说 ...