php 工厂模式

本文介绍了工厂模式在PHP中的应用,阐述了其用于创建对象实例化的功能,以及带来的系统可扩展性和修改量最小化的优势。通过一个玩具工厂的例子,详细说明了简单工厂的工作原理,展示了如何根据玩具名称动态创建DogToy、CatToy和BearToy对象。同时,文中还展示了如何通过添加玩具类型的检查,确保工厂只能生产指定类型的玩具。

工厂模式的作用: 创建一个实例化对象

工厂模式的优点: 给你的系统带来更大的可扩展性和尽可能少的修改量

例子:

<?php
 4     class Calc{
 5         public function calculate($num1,$num2,$operator){
 6             try {
 7                 $result=0;
 8                 switch ($operator){
 9                     //......省略......
10                     case '%':
11                         $result= $num1%$num2;
12                         break;
13                     //......省略......
14                 }
15             }catch (Exception $e){
16                 echo "您输入有误:".$e->getMessage();
17             }
18         }
19     }
20 ?>

或者

    public static Operation createOperate(string operate)
    {
        Operation oper = null;
        switch (operate)
        {
            case "+":
                {
                oper = new OperationAdd();
                break;
                }
            case "-":
                {
                oper = new OperationSub();
                break;
                }
            case "*":
                {
                oper = new OperationMul();
                break;
                }
            case "/":
                {
                oper = new OperationDiv();
                break;
                }
        }
        return oper;
    }
    } //写接口

  在设计模式中,工厂模式有三种,即:简单工厂模式、工厂方法模式和抽象工厂模式。那么,为什么取名叫叫工厂呢?我们都知道,工厂是生产产品的地方。给这些设计模式取名工厂的意思也就是告诉大家,这三种模式其实就是为了生产产品(即创建对象)。而且,这三者之中,以简单工厂最为简单(有点废话了)。

        那么,什么是简单工厂呢?简单工厂就是,告诉工厂我要生产的产品的名字,你给我生产出相应的产品出来(即告诉对象名,创建对象)。举个例子,有一个玩具工厂,有很多车间,可以生产狗,熊,猫三种玩具。那么,我们有如下定位:

  1. class DogToy  
  2. {  
  3.   
  4. }  
  5.   
  6. class CatToy {  
  7.   
  8. }  
  9.   
  10. class BearToy  
  11. {  
  12.   
  13. }  
        当我们需要生产一个猫玩具的时候,可以用new CatToy(), 生成狗玩具的时候可以用new DogToy(), ...。这样,看起来,好像也没有什么问题。但,如果我是公司的领导,我就得先找到生产狗玩具的车间,告诉他们,给我生产狗玩具。如果我要生产熊和猫也一样。那这样是不是很累?那领导说话了,不行,这种事怎么能让我去干?我还有好多事儿要做呢。具体该如何操作,还是让车间主管去处理吧。于是任命了一个车间主管。而车间主管的职责就是随时候命,需要生产什么你就去处理。
  1. class FactoryManager  
  2.  {  
  3.     public function make()  
  4.     {  
  5.           
  6.     }  
  7.  }  
        领导告诉你要生产什么,只要告诉主管要生产的玩具的名字就可以了,其它该怎么生产由主管去联系车间负责生产。
  1. class FactoryManager  
  2. {  
  3.    
  4. //你让我生产什么,告诉我玩具的名字就可以了  
  5. public static function make($toyName)  
  6. {  
  7.     switch ($toyName) {  
  8.         case "cat":  
  9.             return new CatToy();  
  10.         case "bear":  
  11.             return new BearToy();  
  12.         case "dog":  
  13.             return new DogToy();  
  14.     }  
  15. }  
  16. }  

        如果领导告诉我们,需要生产驴玩具,但我们生产不了这种玩具。那得告诉领导吧。所以我们需要存一份我们能生成的列表。另外,我们需要稍微整理一下。因为要生产的玩具名称和类名很有规律(玩具名首字母大写后加一个Toy就可以了)。于是有如下代码:

  1. class DogToy  
  2. {  
  3.   
  4. }  
  5.   
  6. class CatToy  
  7. {  
  8.   
  9. }  
  10.   
  11. class BearToy  
  12. {  
  13.   
  14. }  
  15.   
  16. class FactoryManager  
  17. {  
  18.   
  19.    //指定我们工厂可以生产的玩具类型  
  20.    public static $allowToyName = array(  
  21.        "bear""cat""dog"  
  22.    );  
  23.   
  24.    //你让我生产什么,告诉我玩具的名字就可以了  
  25.    public static function make($toyName)  
  26.    {  
  27.        //检查这种玩具是否能生产  
  28.        $toyName = strtolower($toyName);  
  29.        if (!in_array($toyName, self::$allowToyName)) {  
  30.            throw new Exception("没法生产这种玩具");  
  31.        }  
  32.   
  33.        //生产玩具  
  34.        $className = ucfirst($toyName).'Toy';  
  35.        return new $className();  
  36.    }  
  37. }  
        从上面代码可以看出来。所有的创建对象的工作,都交给了工厂的主管来做。它负责每个产品的生产情况。领导不用关心,只关心我要什么产品就可以了---这就是简单工厂模式的好处.而且我们发现,工厂能生产什么样的玩具,这个需要可控。也就是说,对于简单工厂模式来说,它适用于创建的对象类型可能比较少。同时,我们可以看到,这种简单工厂,就是依靠一个创建对象的类里面的一个静态方法来创建需要的对象。因此我们也把简单工厂叫做:静态工厂方法.


 

看完文章再回头来看下这张图,效果会比较好


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值