设计模式之工厂模式

来源:互联网 发布:java小游戏开发 编辑:程序博客网 时间:2024/05/20 12:51

工厂适配器模式主要为了降低对象之间的耦合性。将创建对象的事情交给工厂统一去创建,使用者不必知道创建的具体细节。

工厂适配器模式主要有三种:简单工厂模式,工厂方法模式,抽象工厂模式。

简单工厂模式:就是创建一个工厂类,每当使用者需要调用对象时,就让工长代生产一个对象。(注:只有一个工厂类生产全部的对象)

  1. <?php  
  2. /** 
  3.  * 车子系列 
  4.  * 
  5.  */  
  6. abstract Class BWM{  
  7.     function __construct($pa) {  
  8.   
  9.     }  
  10. }  
  11. Class BWM320 extends BWM{  
  12.     function __construct($pa) {  
  13.   
  14.     }  
  15. }  
  16. Class BMW523 extends BWM{  
  17.    function __construc($pb){  
  18.   
  19.    }  
  1. class Factory {  
  2.   
  3.   
  4.     static function  createBMW($type){  
  5.         switch ($type) {  
  6.           case 320:  
  7.              return new BWM320();  
  8.           case 523:  
  9.              return new BMW523();  
  10.         //....  
  11.    }  
  1. class Customer {  
  2.     private $BMW;  
  3.     function getBMW($type){  
  4.         $this¬-> BMW =  Factory::createBMW($type);  
  5.     }  
  6. }  
工厂方法模式:
1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
       2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。 
       3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。
       4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

  1. 产品类:
  2. abstract Class BWM{  
  3. function __construct($pa) {  
  4.   
  5. }  
  6. }  
  7. Class BWM320 extends BWM{  
  8. function __construct($pa) {  
  9.   
  10. }  
  11. }  
  12. Class BMW523 extends BWM{  
  13.    function __construc($pb){  
  14.   
  15. }  
工厂类:

  1. /** 
  2.  * 创建工厂的接口 
  3.  * 
  4.  */  
  5. interface FactoryBMW {   
  6.        function createBMW();   
  7. }   
  8.   
  9.   
  10. /** 
  11.  *  
  12.  * 创建BWM320车 
  13.  */  
  14. class FactoryBWM320 implements FactoryBMW {  
  15.    function  createBMW($type){  
  16.       return new BWM320();  
  17.    }  
  18.   
  19. }  
  20.   
  21.   
  22. /** 
  23.  *  
  24.  * 创建BWM523车 
  25.  */  
  26. class FactoryBWM523 implements FactoryBMW {  
  27.    function  createBMW($type){  
  28.       return new BMW523();  
  29.    }  
  30. }
客户类:

  1. class Customer {  
  2.    private $BMW;  
  3.    function  getBMW($type){  
  4.       switch ($type) {  
  5.         case 320:  
  6.            $BWM320 = new FactoryBWM320();  
  7.            return $BWM320->createBMW();  
  8.         case 523:  
  9.            $BWM523 = new FactoryBWM523();  
  10.            return $BWM320->createBMW();  
  11.             //....  
  12.       }  
  13.   
  14.   }  
  15. }  
以上两种方式在增加新产品是扔需要改动较多的代码,可以使用反射机制解决此问题。

  1.  class Customer {  
  2.      private $BMW;  
  3.      function  getBMW($type){  
  4.          $class = new ReflectionClass('FactoryBWM' .$type );//建立 'FactoryBWM'这个类的反射类    
  5.           $instance  = $class->newInstanceArgs();//相当于实例化'FactoryBWM' .$type类    
  6.           return $instance->createBMW();  
  7.         //或者直接   
  8.          /** 
  9.          * $instance = new 'FactoryBWM' .$type(); 
  10.          * return $instance->createBMW(); 
  11.          */  
  12.     }  
抽象工厂:

  1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
     2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
     3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。
     4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

产品类:

  1. abstract class  BWM{  
  2. }  
  3.   
  4. class BWM523 extends  BWM {  
  5. }  
  6. class BWM320 extends  BWM {  
  7.   
  8.   
  9. }  
  10. /** 
  11.  * 空调 
  12.  * 
  13.  */  
  14. abstract class aircondition{  
  15. }  
  16. class airconditionBWM320  extends aircondition {  
  17.   
  18. }  
  19. class airconditionBWM52 extends aircondition {  
  20.   
  21. }  
工厂类:

  1. /** 
  2.  * 创建工厂的接口 
  3.  * 
  4.  */  
  5. interface FactoryBMW {   
  6.      function createBMW();   
  7.      function createAirC();   
  8. }   
  9.   
  10.   
  11. /** 
  12.  *  
  13.  * 创建BWM320车 
  14.  */  
  15. class FactoryBWM320 implements FactoryBMW {  
  16.     function  createBMW(){  
  17.     return new BWM320();  
  18. }  
  19. function  createAirC(){ //空调  
  20.     return new airconditionBWM320();  
  21. }  
  22. }  
  23.   
  24.   
  25. /** 
  26.  *  
  27.  * 创建BWM523车 
  28.  */  
  29. class FactoryBWM523 implements FactoryBMW {  
  30.     function  createBMW(){  
  31.     return new BWM523();  
  32. }  
  33. function  createAirC(){  
  34.     return new airconditionBWM523();  
  35. }  
  36. }  
  37. 客户类
  1. class Customer {  
  2.    private $BMW;  
  3.    private $airC;  
  4.    function  getBMW($type){  
  5.        $class = new ReflectionClass('FactoryBWM' .$type );
  6.         $instance  = $class->newInstanceArgs(); 
  7.         $this->BMW =  $instance->createBMW();  
  8.        $this->airC =  $instance->createAirC();  
  9.    }  
抽象工厂类与工厂方法类的区别在于一个具体工厂类生产多个具体抽象类。

0 0
原创粉丝点击