PHP中“简单工厂模式”实例讲解(转)
|
1
2
3
4
5
6
7
8
|
原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html简单工厂模式:①抽象基类:类中定义抽象一些方法,用以在子类中实现②继承自抽象基类的子类:实现基类中的抽象方法③工厂类:用以实例化对象看完文章再回头来看下这张图,效果会比较好 |

|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
1 采用封装方式 2 3 <?php 4 class Calc{ 5 /** 6 * 计算结果 7 * 8 * @param int|float $num1 9 * @param int|float $num210 * @param string $operator11 * @return int|float12 */13 public function calculate($num1,$num2,$operator){14 try {15 $result=0;16 switch ($operator){17 case '+':18 $result= $num1+$num2;19 break;20 case '-':21 $result= $num1-$num2;22 break;23 case '*':24 $result= $num1*$num2;25 break;26 case '/':27 if ($num2==0) {28 throw new Exception("除数不能为0");29 }30 $result= $num1/$num2;31 break;32 }33 return $result;34 }catch (Exception $e){35 echo "您输入有误:".$e->getMessage();36 }37 }38 }39 $test=new Calc();40 // echo $test->calculate(2,3,'+');//打印:541 echo $test->calculate(5,0,'/');//打印:您输入有误:除数不能为042 ?>优点:以上代码使用了面向对象的封装特性,只要有了include这个类,其他页面就可以随便使用了缺点:无法灵活的扩展和维护比如:想要增加一个“求余”运算,需要在switch语句块中添加一个分支语句,代码需要做如下改动 1 添加分支语句 2 3 <?php 4 class Calc{ 5 public function calculate($num1,$num2,$operator){ 6 try { 7 $result=0; 8 switch ($operator){ 9 //......省略......10 case '%':11 $result= $num1%$num2;12 break;13 //......省略......14 }15 }catch (Exception $e){16 echo "您输入有误:".$e->getMessage();17 }18 }19 }20 ?>代码分析:用以上方法实现给计算器添加新的功能运算有以下几个缺点①需要改动原有的代码块,可能会在为了“添加新功能”而改动原有代码的时候,不小心将原有的代码改错了②如果要添加的功能很多,比如:‘乘方’,‘开方’,‘对数’,‘三角函数’,‘统计’,或者添加一些程序员专用的计算功能,比如:And, Or, Not, Xor,这样就需要在switch语句中添加N个分支语句。想象下,一个计算功能的函数如果有二三十个case分支语句,代码将超过一屏,不仅令代码的可读性大大降低,关键是,为了添加小功能,还得让其余不相关都参与解释,这令程序的执行效率大大降低解决途径:采用OOP的继承和多态思想 1 简单工厂模式的初步实现 2 <?php 3 /** 4 * 操作类 5 * 因为包含有抽象方法,所以类必须声明为抽象类 6 */ 7 abstract class Operation{ 8 //抽象方法不能包含函数体 9 abstract public function getValue($num1,$num2);//强烈要求子类必须实现该功能函数10 }11 /**12 * 加法类13 */14 class OperationAdd extends Operation {15 public function getValue($num1,$num2){16 return $num1+$num2;17 }18 }19 /**20 * 减法类21 */22 class OperationSub extends Operation {23 public function getValue($num1,$num2){24 return $num1-$num2;25 }26 }27 /**28 * 乘法类29 */30 class OperationMul extends Operation {31 public function getValue($num1,$num2){32 return $num1*$num2;33 }34 }35 /**36 * 除法类37 */38 class OperationDiv extends Operation {39 public function getValue($num1,$num2){40 try {41 if ($num2==0){42 throw new Exception("除数不能为0");43 }else {44 return $num1/$num2;45 }46 }catch (Exception $e){47 echo "错误信息:".$e->getMessage();48 }49 }50 }51 ?>这里采用了面向对象的继承特性,首先声明一个虚拟基类,在基类中指定子类务必实现的方法(getValue())分析:通过采用面向对象的继承特性,我们可以很容易就能对原有程序进行扩展,比如:‘乘方’,‘开方’,‘对数’,‘三角函数’,‘统计’等等。<?php /** * 求余类(remainder) * */ class OperationRem extends Operation { public function getValue($num1,$num2){ return $num1%$num12; } }?>我们只需要另外写一个类(该类继承虚拟基类),在类中完成相应的功能(比如:求乘方的运算),而且大大的降低了耦合度,方便日后的维护及扩展现在还有一个问题未解决,就是如何让程序根据用户输入的操作符实例化相应的对象呢?解决办法:使用一个单独的类来实现实例化的过程,这个类就是工厂代码如下: 1 <?php 2 /** 3 * 工程类,主要用来创建对象 4 * 功能:根据输入的运算符号,工厂就能实例化出合适的对象 5 * 6 */ 7 class Factory{ 8 public static function createObj($operate){ 9 switch ($operate){10 case '+':11 return new OperationAdd();12 break;13 case '-':14 return new OperationSub();15 break;16 case '*':17 return new OperationSub();18 break;19 case '/':20 return new OperationDiv();21 break;22 }23 }24 }25 $test=Factory::createObj('/');26 $result=$test->getValue(23,0);27 echo $result;28 ?> |
PHP中“简单工厂模式”实例讲解(转)的更多相关文章
- PHP中“简单工厂模式”实例讲解
原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html 简单工厂模式:①抽象基类:类中定义抽象一些方法, ...
- PHP 工厂模式 实例讲解
简单工厂模式:①抽象基类:类中定义抽象一些方法,用以在子类中实现②继承自抽象基类的子类:实现基类中的抽象方法③工厂类:用以实例化对象 看完文章再回头来看下这张图,效果会比较好 1 采用封装方式 2 3 ...
- PHP设计模式之 单例模式 工厂模式 实例讲解
单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的.所有的单例模式至少拥有以下三种公共元素:1. 它们必须拥有一个构造函数,并且必须被标记为priva ...
- c#中简单工厂模式
运算类 public class yunsuan { public static operation create(string operate) { operation oper = null; s ...
- C#设计模式(2)-简单工厂模式
引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...
- C#设计模式之二简单工厂模式(过渡模式)
一.引言 之所以写这个系列,是了为了自己更好的理解设计模式,也为新手提供一些帮助,我都是用最简单的.最生活化的实例来说明.在上一篇文章中讲解了单例模式,今天就给大家讲一个比较简单的模式--简单工厂模式 ...
- C#设计模式之简单工厂模式(过渡模式)
一.引言 之所以写这个系列,是了为了自己更好的理解设计模式,也为新手提供一些帮助,我都是用最简单的.最生活化的实例来说明.在上一篇文章中讲解了单例模式,今天就给大家讲一个比较简单的模式——简单工厂模式 ...
- 设计模式(二)简单工厂模式(Simple Factory Pattern)
一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...
- C#设计模式(2)——简单工厂模式(转)
C#设计模式(2)——简单工厂模式 一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...
随机推荐
- keil使用VScode外部编辑器
1.首先我们双击桌面的keil图标,打开keil主界面: 2.点击上方菜单栏的Tools菜单,选择如下图所示的选项: 3.点击如下图所示的菜单上红笔标注的地方,给这个工具命名为vscode: 4.然后 ...
- HTTP、TCP、UDP,Socket,HTTPS
TCP HTTP UDP三者的关系如下: TCP/IP是个协议组,可分为四个层次:网络接口层.网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协 ...
- RAM与FLASH
以前一直使用STM32但是对 变量 或 函数 的存储域没做任何了解:只知道你需要存储的东西就放在Flash的后面几页就好了:这次接触到STM8发现编译器里面有特别的存储查看器就打算看看到底是怎么存储的 ...
- 去除HTML中的标签内容
采集后的数据都带有'<>'html标签: <img src="http://i4.hdfimg.com/www/images/giftrans/3d/da/7b/18414 ...
- Django优雅集成MongoDB
Django优雅集成MongoDB 将Django与MongoDB集成 在不更改Django ORM的情况下,将MongoDB用作Django项目的后端数据库.使用Django Admin在Mon ...
- Python+Selenium学习笔记17 - HTML测试报告
运行少量case时 1 # coding = utf-8 2 3 from selenium import webdriver 4 import unittest 5 import time 6 fr ...
- setTimeout使用问题
通常禁止使用setTimeout的情况: 1.不能用于模拟异步,有的人不熟悉异步流程,而使用setTimeout伪实现,比如设置一个 setTimeout 来等待函数执行完毕,正确做法是使用回调来处理 ...
- YOLOV4知识点分析(二)
YOLOV4知识点分析(二) 6. 数据增强相关-mixup 论文名称:mixup: BEYOND EMPIRICAL RISK MINIMIZATION 论文地址:https://arxiv.org ...
- 激光雷达Lidar与毫米波雷达Radar:自动驾驶的利弊
激光雷达Lidar与毫米波雷达Radar:自动驾驶的利弊 Lidar vs Radar: pros and cons for autonomous driving 新型无人驾驶汽车的数量在缓慢增加,各 ...
- NX二次开发-获取WCS标识
函数:UF_CSYS_ask_wcs() 函数说明:获取工作坐标系对象的标识. 用法: 1 #include <uf.h> 2 #include <uf_csys.h> 3 e ...