MVC设计模式之---工厂模式
浏览量:392
公司安排和同事分享一下工厂模式,没办法直接只好先学习一下,但是看了半天的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,现在已经成功了,恭喜你!!!!!!!!!!!!

神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。