php工厂模式计算器,php设计模式之工厂模式(工厂模式实现计算器功能)
因为工作的需要,陆陆续续接触了很不多不同的框架,也慢慢渗透了一些设计模式。
当初选择入手php,就是因为脚本语言,简单易学。正因为是脚本语言很多人拿着php做着面对过程的事情。在工作中我维护过一个function写了1000行的代码,还要一行一行下来开始寻找bug。当时我就想设计模式所带来的好处。
什么是工厂
简单的抽象成生活的一个例子就是,你需要一双鞋子,但是你不用关心鞋子的构造,采用什么布料,怎么制作。这时候你就需要告诉制造鞋子工厂说 我需要一双运动鞋。
你 > client 发送请求
鞋子工厂 > factory 接受请求 再返回一双鞋给用户
案例
我们现在要用php实现一个计算器的功能,具有加减乘除的功能,很多刚学php或者刚毕业的应届生一看到这就乐了,这不是很简单吗,一个php脚本几行代码就能搞定的东西。
//主程序代码
$parmasFirst = 1;
$parmasSecond = 2;
$operator = '/';
$result = 0;
switch($operator){
case '+': $result = $parmasFirst + $parmasSecond ;break;
case '-': $result = $parmasFirst - $parmasSecond ;break;
case '*': $result = $parmasFirst * $parmasSecond ;break;
case '/': {
if (empty($parmasSecond)) {
throw new Exception('error parms ');
}
$result = $parmasFirst / $parmasSecond;
break;
}
default:throw new Exception('error operator');
}
echo $result;
我们在设想一下,随着计算器的不断升级,不断有开平方、立方根……的复杂算法,你该怎么去维护代码?
你们会想 不就是在switch继续加分支。我们假设如果业务不断的扩展一个,功能被扩充了几千行代码的switch,你该怎么去维护?
第一种方法就是对switch里面的代码进行封装
封装后的代码
switch($operator)
{
case '+':
{
$operatorAddObj = new OperatorAdd($parmasFirst,$parmasSecond);
$result = $operatorAddObj->getResult();
break;
}
case '-':
{
$operatorAddObj = new OperatorSub($parmasFirst,$parmasSecond);
$result = $operatorAddObj->getResult();
break;
}
case '*':
{
$operatorAddObj = new OperatorMul($parmasFirst,$parmasSecond);
$result = $operatorAddObj->getResult();
break;
}
case '/':
{
$operatorAddObj = new OperatorDiv($parmasFirst,$parmasSecond);
$result = $operatorAddObj->getResult();
break;
}
default:throw new Exception('error operator');
}
abstract class Operator
{
protected $a,$b;
public function __construct($parmasFirst,$parmasSecond)
{
$this->a = $parmasFirst;
$this->b = $parmasSecond;
}
abstract function getResult();
}
class OperatorAdd extends Operator
{
public function getResult()
{
return $this->a + $this->b;
}
}
class OperatorSub extends Operator
{
public function getResult()
{
return $this->a - $this->b;
}
}
class OperatorMul extends Operator
{
public function getResult()
{
return $this->a * $this->b;
}
}
class OperatorDiv extends Operator
{
public function getResult()
{
if(empty($this->b)) {
throw new Exception('error parms b=0');
}
return $this->a / $this->b;
}
}
但是你还是没有脱离switch这个架构。现在很多php框架都倡导模块化的设计理念,我们需要对不同的运算算法封装成独立一个模块,而不是通过switch不断去扩充,我们添加功能也不会去修改 主程序代码,以便带来不必要的问题bug.
通过工厂模式实现计算器
我们稍微把主程序的代码的swith进行修改
//主程序代码
$parmasFirst = 1;
$parmasSecond = 1;
$operator = '/';
$result = 0;
$result = OperatorFactory::create($parmasFirst,$parmasSecond,$operator)->getResult();
echo $result;
class OperatorFactory
{
public static $operator = array(
'*' => 'mul',
'/' => 'div',
'-' => 'sub',
'+' => 'add'
);
public static function create($a,$b,$operator)
{
if(!array_key_exists(strtolower($operator),self::$operator)) {
throw new Exception('no operator');
}
$operatorName = self::$operator[$operator];
$operatorObj = 'Operator' . ucfirst($operatorName);
if(!class_exists($operatorObj)) {
throw new Exception('no class');
}
return new $operatorObj($a,$b);
}
}
这样有个好处就是 你去修改 其中一个算法的时候,不会去破坏其他算法的内部结构,而且你新增一个算法也很方便,也不用去更改主程序代码,只要稍微修改工厂模式就可以。便于代码维护
之后不断更新不同的设计模式来实现不同的案例和应用场景。 我已经给自己定好了目标了! 做一名phper,我要不断学习,并且在其中找到快乐,我才会在这条坑上越陷越深!
php工厂模式计算器,php设计模式之工厂模式(工厂模式实现计算器功能)相关推荐
- 抽象工厂模式java_Java描述设计模式(04):抽象工厂模式
一.抽象工厂模式 1.生活场景 汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂. 2.抽象工厂模式 1) 抽象工厂模式:定义了一 ...
- java蝇量模式_Head First设计模式——蝇量和解释器模式
蝇量 蝇量模式:如果让某个类的一个实例能用来提供许多"虚拟实例",就使用蝇量模式. 在一个设计房子的平台中,周围要加上一些树,树有一个坐标XY坐标位置,而且可以根据树的年龄动态将自 ...
- java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式
抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...
- java外观模式实例_Java设计模式(11)----------外观模式
1.介绍 外观模式是一种结构型设计模式.在外观模式中,外观类中提供一个或者一组对外的接口.客户端对于复杂系统的访问是通过外观类的接口进行的,从而解除了客户端与复杂系统之间的耦合,隐藏了复杂系统内部的逻 ...
- php值对象模式场景,php设计模式介绍之值对象模式第1/5页
例如:通常用一个对象描述一个日期.一个数字或者货币.日期.整数或美元的类定义是都是便于使用的.快捷.便于封装的,并且方便进行拷贝,相互比较,甚至是创建. 从表面上看,这些描述简单的对象很容易被执行:它 ...
- Java设计模式(1)工厂模式(Factory模式)
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
- 工厂中的流水线竟然是活生生的建造者模式
看个图放松一下 从度娘上找了一个动图,很清楚的可以看到这是一条流水线.黄色衣服的工人负责将盒子放进袋子里,蓝色工人负责将袋子密封.流水线大家应该都清楚,就是每个人专门负责一道工序,一个完整的产品需 ...
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...
- Java设计模式(10)代理模式(Proxy模式)
理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...
最新文章
- python 难度-Python 入门的难度
- 烂泥:纠结一天的zencart网站问题,终于解决了
- DataGridView显示数据库数据(一)
- Ubuntu中文输入法崩溃问题(候选框乱码)
- Vue的v-for中列表项拖拽排序详细方法
- Spring Security --SecurityConfig的详细配置
- 【Boost】boost库asio详解9——UDP的简单例子1
- 字节跳动offer流程多长时间_字节跳动-运营实习生-面经实录(已Offer??)
- 研究生科研必备!!!2015-2020年各类国际会议基于图像的三维重建论文综述(1)——总览
- TeamViewer 收不到邮件该怎么办?
- 阿里云盘秒传使用方法
- 笔记-SIM900A模块开发:GPRS建立TCP连接与服务器进行数据传输
- MCU裸机:一、315/433MHz/IR射频解码开发
- 【Learning Notes】Sequence Transducer
- 怎么为PE添加输入法
- Android自定义View——实现字母导航栏
- PDFBOX将PDF转图片(PNG背景透明)
- Hibernate主键生成策略总结
- Verilog专题(二十三)Lemmings2
- 假如我来架构12306网站
热门文章
- 太原科技大学主校区计算机学院,2021年太原科技大学有几个校区,大一新生在哪个校区...
- Python学习之cookies及session用法
- php验证码刷新_php实现点击可刷新验证码
- flutter-可拖动悬浮按钮
- 光有想法怎么开技术公司?
- 天天聚财网———2014年最具潜力的P2P借贷平台
- html css 内联样式_内联CSS指南–如何直接设置HTML标签的样式
- no module named pytz(pycharm)
- javaMail实现邮件发送
- 设置maven的本地位置和maven镜像