晓夏

北漂的女孩

Good Luck To You!

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,现在已经成功了,恭喜你!!!!!!!!!!!!

神回复

发表评论:

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