MVC设计模式之---工厂模式
浏览量:386
公司安排和同事分享一下工厂模式,没办法直接只好先学习一下,但是看了半天的java所讲的工厂模式,那个叫累啊,突然发现举个例子来处理其实非常简单:
例子:我们刚开始学习程序开发,写一个功能,计算两个数的加减乘除:
<?php /* *1.定义一个类,计算两个的数的加减乘除 *@param int|float $n1 *@param int|float $n2 *@param string $style *@return int|float */ class Count{ public function opration($n1,$n2,$style){ switch ($style){ case '+': return $n1 + $n2; break; case '-': return $n1 - $n2; break; case '*': return $n1 * $n2; break; case '/': return $n1 / $n2; break; } } } $count=new Count(); echo $count->opration(1,2,'+'); ?>
优点:以上代码使用了面向对象的封装特性,只要有了include这个类,其他页面就可以随便使用了
缺点:如果我们有多个计算式,我们是不是会一直在里面新增case,万一我们不小心修改错了,是不是整个方法都不能使用了,相反我们以后维护和开发都不方便,并且有风险,无法灵活的扩展和维护
解决途径:采用OOP的继承和多态思想
<?php //初步的工厂实现方法 /* 操作类因为包含有抽象方法,所以类必须声明为抽象类*/ abstract class Count{ //抽象方法不能包含函数体 abstract public function getValue($n1,$n2);//强烈要求子类必须实现该功能函数 } //加法运算 class CountAdd extends Count{ public function getValue($n1,$n2){ return $n1+$n2; } } //减法运算 class CountSub extends Count{ public function getValue($n1,$n2){ return $n1-$n2; } } //............还有很多的算法要去实现 //新增除法类 class Countdiv extends Count{ public function getValue($n1,$n2){ if($n2 == 2){ return "除数不能为0"; }else{ return $n1/$n2; } } } ?>
这里采用了面向对象的继承特性,首先声明一个虚拟基类,在基类中指定子类务必实现的方法(getValue())
分析:通过采用面向对象的继承特性,我们可以很容易就能对原有程序进行扩展,比如:‘乘方’,‘开方’,‘对数’,‘三角函数’,‘统计’等等。
<?php /** * 新增求余类(remainder) * */ class CountRem extends Count { public function getValue($n1,$n2){ return $n1%$n2; } } ?>
我们只需要另外写一个类(该类继承虚拟基类),在类中完成相应的功能(比如:求乘方的运算),而且大大的降低了耦合度,方便日后的维护及扩展
现在还有一个问题未解决,就是如何让程序根据用户输入的操作符实例化相应的对象呢?
解决办法:使用一个单独的类来实现实例化的过程,这个类就是工厂
<?php /** * 工程类,主要用来创建对象 * 功能:根据输入的运算符号,工厂就能实例化出合适的对象 * */ class Factory{ public static function createObj($style){ switch ($style){ case '+': return new CountAdd(); break; case '-': return new CountSub(); break; case '*': return new CountSub(); break; case '/': return new CountDiv(); break; } } } $test=Fac::createObj('/'); $result=$test->getValue(23,0); echo $result;
ok,现在已经成功了,恭喜你!!!!!!!!!!!!
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。