php设计模式之工厂方法

来源:互联网 发布:nodejs遍历json数据 编辑:程序博客网 时间:2024/05/16 06:24

 前面我们介绍了简单工厂,今天我们继续学习另外一个工厂——工厂方法。

  

        具体案例:请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我们一般采用FactoryMethod模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

        工厂方法模式核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节,如下图:


    工厂方式模式主要由以下几种角色组成:

        抽象工厂角色(IServerFactory):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

       具体工厂角色(ChickenLegBaoFactory):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

         抽象产品角色(IHanbao):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

         具体产品角色(ChickenLegBao):这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。


        根据以上UML类图和角色编写以下PHP代码:

[php] view plain copy
 print?
  1. <?php  
  2. /** 
  3.  * Created by PhpStorm. 
  4.  * User: Jiang 
  5.  * Date: 2015/4/16 
  6.  * Time: 22:12 
  7.  */  
  8.   
  9. /**抽象产品角色       汉堡 
  10.  * Interface IHanbao 
  11.  */  
  12. interface IHanbao  
  13. {  
  14.     function Allay();  
  15. }  
  16.   
  17. /**具体产品角色         肉松汉堡 
  18.  * Class RouSongBao 
  19.  */  
  20. class RouSongBao implements IHanbao  
  21. {  
  22.     function Allay()  
  23.     {  
  24.         echo "I am 肉松汉堡,小的给主人解饿了!<br/>";  
  25.     }  
  26.   
  27. }  
  28.   
  29. /**鸡肉汉堡 
  30.  * Class ChickenBao 
  31.  */  
  32. class ChickenBao implements IHanbao  
  33. {  
  34.     function Allay()  
  35.     {  
  36.         echo "I am 鸡肉汉堡,小的给主人解饿了!<br/>";  
  37.     }  
  38.   
  39. }  
  40.   
  41. /**抽象工厂角色 
  42.  * Interface IServerFactory 
  43.  */  
  44. interface IServerFactory  
  45. {  
  46.     function MakeHanbao();  
  47. }  
  48.   
  49. /**具体工厂角色     肉松汉堡工厂 
  50.  * Class RouSongFactory 
  51.  */  
  52. class RouSongFactory implements IServerFactory  
  53. {  
  54.   
  55.     function MakeHanbao()  
  56.     {  
  57.         return new RouSongBao();  
  58.     }  
  59. }  
  60.   
  61. class ChickenFactory implements IServerFactory  
  62. {  
  63.   
  64.     function MakeHanbao()  
  65.     {  
  66.         return new ChickenBao();  
  67.     }  
  68. }  

          测试代码:

[php] view plain copy
 print?
  1. header("Content-Type:text/html;charset=utf-8");  
  2. //------------------------工厂方式测试代码------------------  
  3. require_once "./FactoryMethod/FactoryMethod.php";  
  4.   
  5. //-----------------餐厅厨师-----------  
  6. $chickenFactory=new ChickenFactory();  
  7. $rouSongFactory=new RouSongFactory();  
  8.   
  9. //-----------点餐------------  
  10. $chicken1=$chickenFactory->MakeHanbao();  
  11. $chicken2=$chickenFactory->MakeHanbao();  
  12. $rouSong1=$rouSongFactory->MakeHanbao();  
  13. $rouSong2=$rouSongFactory->MakeHanbao();  
  14.   
  15. //------------------顾客吃饭---------  
  16. $chicken1->Allay();  
  17. $chicken2->Allay();  
  18. $rouSong1->Allay();  
  19. $rouSong2->Allay();  

     用浏览器运行测试代码我们可以发现,顾客都享用了自己的食物。


        工厂方法模式优缺点:

        优势:克服了简单工厂模式违背开放-封闭的原则,保持了封装对象创建过程的优点。

        缺陷:当增加产品时,就得增加一个产品工厂的类,增加额外的开发量。避免不了分支判断的问题。

       简单工厂模式与工厂方法模式的比较:

 

      1. 结构复杂度

          简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,从而增加了结构的复杂程度。

     2.代码复杂度

          代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。

     3.管理上的难度

          假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。

原创粉丝点击