宝哥软件园

PHP中“工厂方法模式”示例代码的解释

编辑:宝哥软件园 来源:互联网 时间:2021-10-08

工厂方法模式:抽象基类:在类中定义一些抽象方法来实现继承自抽象基类的子类:在基类中实现抽象方法工厂类:来实例化对象看完文章回头看这张图效果会更好

封装复制的代码如下:Classcalc {/* * *计算结果* * @ param int | float $ num 1 * @ param int | float $ num2 * @ param string $ operator * @ return int | float */public function calculate($ num 1,$ num 2,$ operator){ try { $ result=0;switch($ operator){ case ' ' : $ result=$ num 1 $ num 2;打破;case '-' : $ result=$ num 1-$ num 2;打破;大小写' * ' : $ result=$ num1 * $ num2打破;case '/' : if($ num 2==0){引发新异常('除数不能为0 ');} $ result=$ num 1/$ num 2;打破;返回$ result} }catch(异常$e){ echo '您输入了: '。$ e-Getmessage();} } } $ test=new Calc();//echo $test-calculate(2,3 ' ');//print :5 echo $ test-calculate(5,0,'/');//打印:你输入错误。的除数不能是0?优点:上面的代码使用了面向对象的封装特性,只要有include类,其他页面都可以随便使用。缺点:不能灵活扩展维护。例如,如果您想要添加一个“余数”操作,您需要在switch语句块中添加一个分支语句,并且代码需要更改如下。添加一个分支语句,复制代码如下:php类Calc { public function calculate($ num 1,$num2,$ operator){ try { $ result=0;Switch ($operator){ //.省略.案例“%”: $ result=$ num 1% $ num 2;打破;//.省略.} }catch(异常$e){ echo '您输入了3360 '。$ e-get message();} } } ?代码分析:在计算器开关中添加新功能上述方法存在以下缺点:原代码块需要更改,为“添加新功能”而更改原代码时,可能会意外更正原代码;如果要加的函数很多,比如:‘幂’、‘处方’、‘对数’、‘三角函数’、‘统计’,或者加一些程序员的特殊计算。试想一下,如果一个带有计算功能的函数中有二三十个case branch语句,那么代码就会超过一屏,这样不仅会大大降低代码的可读性,还会让其他无关的人为了增加小函数而参与解释,这样会大大降低程序的执行效率。解决方案:采用OOP继承和多态思想,工厂方法模式复制代码的初步实现如下:Php /** *操作类*必须声明为抽象类*/抽象类Operation{ //抽象方法不能包含抽象公共函数getvalue ($ num1,$ num 2);//strong烈要求子类必须实现此函数}/* * * add class */class operation add extends operation { public function getvalue($ num 1,$ num 2){ return $ num 1 $ num 2;}}/* * *减法类*/class operation sub扩展了操作{public function getvalue ($ num1,$ num 2){ return $ num 1-$ num 2;}}/* * *乘法类*/class operation mul扩展了操作{public function getvalue ($ num1,$ num 2){ return $ num 1 * $ num 2;}}/* * *除法类*/类操作div扩展操作{公共函数getvalue ($ num1,$ num 2){ try { if($ num 2==0){抛出新异常('除数不能为0 ');} else { return $ num 1/$ num 2;} }catch(异常$e){ echo '错误消息:“”。$ e-Getmessage();} } } ?本文采用了面向对象的继承特性。首先,声明一个虚拟基类,并在基类中指定子类必须实现的方法(getValue())。分析:通过采用面向对象的继承特性,我们可以很容易地对原程序进行扩展,比如:的‘幂’、‘根’、‘对数’、‘三角函数’、‘统计’等等。

复制代码如下:Php /** *剩余类* */类操作rem扩展操作{public function getvalue ($ num1,$ num 2){ return $ num 1% $ num 12;} } ?我们只需要编写另一个类(它继承了虚拟基类),并完成类中相应的功能(比如计算幂),大大降低了耦合度,方便了以后的维护和扩展。还有一个没有解决的问题,就是如何让程序根据用户输入的操作符实例化相应的对象?解决方案:用单个类实现实例化过程,就是工厂代码如下:复制代码如下:Php /** *工程类,主要用于创建对象*函数:根据输入的操作符号,工厂可以实例化合适的对象* */class factory { public static Function create obj($ oper){ switch($ oper){ case ' ' : return new operation add();打破;案例'-':返回新的operation sub();打破;大小写' *':返回新的operation sub();打破;case '/':返回新的operation div();打破;} } } $ test=factory : createobj('/');$result=$test-getValue(23,0);echo $结果;原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/.

更多资讯
游戏推荐
更多+