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)——简单工厂模式 一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...
随机推荐
- 贪心算法leetcode-763
int[] lastShow = new int[26]; var list = new LinkedList<Integer>(); for (int i = 0; i < s.l ...
- 【SpringBoot基础系列】手把手实现国际化支持实例开发
[SpringBoot基础系列]手把手实现国际化支持实例开发 国际化的支持,对于app开发的小伙伴来说应该比价常见了:作为java后端的小伙伴,一般来讲接触国际化的机会不太多,毕竟业务开展到海外的企业 ...
- Steam游戏《Northgard(北境之地)》修改器制作
日期:2021.06.07 博客期:181 星期一 [温馨提示]: 我现在把资源先放到开头,不想研究学习的就直接取用.如果修改器失效了,你们可以在博客园本页直接评论,也可以给我发邮件告诉我,就是不要到 ...
- 特斯拉Tesla Model 3整体架构解析(下)
特斯拉Tesla Model 3整体架构解析(中) Tesla Computer Unit 特斯拉已经开发了一个由自动驾驶仪和信息计算机组成的定制"液冷双计算平台"."他 ...
- Docker App应用
Docker App应用 这是一个实验特性. 实验性功能提供了对未来产品功能的早期访问.这些特性仅用于测试和反馈,因为它们可能在没有警告的情况下在不同版本之间更改,或者可以从将来的版本中完全删除.在生 ...
- MySQL压缩包下载解压安装步骤
MySQL官网下载地址:https://downloads.mysql.com/archives/community/ 1.选择自己需要的版本,本教程是mysql-5.7.29-winx64版本 2. ...
- java后端知识点梳理——MySQL
MySQL的索引 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,就像一本书的目录一样,可以加快查询速度.InnoDB 存储引擎的索引模型底层实现数据结构为 ...
- 【SQLite】教程01-SQLite简介与安装
为什么要用 SQLite? 不需要一个单独的服务器进程或操作的系统(无服务器的). SQLite 不需要配置,这意味着不需要安装或管理. 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘 ...
- C# 设置Word文本框中的文字旋转方向
在Word中可插入文本框,默认情况下插入的文本框中的文字方向为横向排列,对于一些特殊文档的设计要求,需要改变文字方向,如本次测试中的文档排版为考生试卷类型,考生信息栏的内容为下图中的这种, 本文将以C ...
- alert日志报错:ERROR: failed to establish dependency between database RACDB and diskgroup resource ora.DATA.dg
一.打开数据库alert日志,发现有报错 ERROR: failed to establish dependency between database RACDB and diskgroup reso ...