因为工作的需要,陆陆续续接触了很不多不同的框架,也慢慢渗透了一些设计模式。

当初选择入手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设计模式之工厂模式(工厂模式实现计算器功能)相关推荐

  1. 抽象工厂模式java_Java描述设计模式(04):抽象工厂模式

    一.抽象工厂模式 1.生活场景 汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂. 2.抽象工厂模式 1) 抽象工厂模式:定义了一 ...

  2. java蝇量模式_Head First设计模式——蝇量和解释器模式

    蝇量 蝇量模式:如果让某个类的一个实例能用来提供许多"虚拟实例",就使用蝇量模式. 在一个设计房子的平台中,周围要加上一些树,树有一个坐标XY坐标位置,而且可以根据树的年龄动态将自 ...

  3. java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式

    抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...

  4. java外观模式实例_Java设计模式(11)----------外观模式

    1.介绍 外观模式是一种结构型设计模式.在外观模式中,外观类中提供一个或者一组对外的接口.客户端对于复杂系统的访问是通过外观类的接口进行的,从而解除了客户端与复杂系统之间的耦合,隐藏了复杂系统内部的逻 ...

  5. php值对象模式场景,php设计模式介绍之值对象模式第1/5页

    例如:通常用一个对象描述一个日期.一个数字或者货币.日期.整数或美元的类定义是都是便于使用的.快捷.便于封装的,并且方便进行拷贝,相互比较,甚至是创建. 从表面上看,这些描述简单的对象很容易被执行:它 ...

  6. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  7. 工厂中的流水线竟然是活生生的建造者模式

    看个图放松一下   从度娘上找了一个动图,很清楚的可以看到这是一条流水线.黄色衣服的工人负责将盒子放进袋子里,蓝色工人负责将袋子密封.流水线大家应该都清楚,就是每个人专门负责一道工序,一个完整的产品需 ...

  8. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  9. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...

  10. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

最新文章

  1. python 难度-Python 入门的难度
  2. 烂泥:纠结一天的zencart网站问题,终于解决了
  3. DataGridView显示数据库数据(一)
  4. Ubuntu中文输入法崩溃问题(候选框乱码)
  5. Vue的v-for中列表项拖拽排序详细方法
  6. Spring Security --SecurityConfig的详细配置
  7. 【Boost】boost库asio详解9——UDP的简单例子1
  8. 字节跳动offer流程多长时间_字节跳动-运营实习生-面经实录(已Offer??)
  9. 研究生科研必备!!!2015-2020年各类国际会议基于图像的三维重建论文综述(1)——总览
  10. TeamViewer 收不到邮件该怎么办?
  11. 阿里云盘秒传使用方法
  12. 笔记-SIM900A模块开发:GPRS建立TCP连接与服务器进行数据传输
  13. MCU裸机:一、315/433MHz/IR射频解码开发
  14. 【Learning Notes】Sequence Transducer
  15. 怎么为PE添加输入法
  16. Android自定义View——实现字母导航栏
  17. PDFBOX将PDF转图片(PNG背景透明)
  18. Hibernate主键生成策略总结
  19. Verilog专题(二十三)Lemmings2
  20. 假如我来架构12306网站

热门文章

  1. 太原科技大学主校区计算机学院,2021年太原科技大学有几个校区,大一新生在哪个校区...
  2. Python学习之cookies及session用法
  3. php验证码刷新_php实现点击可刷新验证码
  4. flutter-可拖动悬浮按钮
  5. 光有想法怎么开技术公司?
  6. 天天聚财网———2014年最具潜力的P2P借贷平台
  7. html css 内联样式_内联CSS指南–如何直接设置HTML标签的样式
  8. no module named pytz(pycharm)
  9. javaMail实现邮件发送
  10. 设置maven的本地位置和maven镜像