设计模式---工厂模式Factory(创建型)

1. 概述

  在编程中,经常需要new一些对象,但是在一些情况下, new操作直接生成对象会带来一些问题。举例来说,许多类型对象的创建需要一系列的步骤,在这种情况下,新对象的建立就是一个“过程”,不仅是一个操作。所以,如何能轻松方便地构造对象实例,而不关心构造对象实例的细节和复杂过程呢?

2. 应用场景

  简化创建对象实例的操作,屏蔽创建对象的具体过程。

3. 示例

(1)简单工厂模式

  建立一个工厂(一个函数或一个类方法)来制造新的对象。

 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    }  
20 }  
21 /** 
22  *  
23  * 工厂创建车 
24  */  
25 class Factory {  
26   
27   
28     static function  createBMW($type){  
29         switch ($type) {  
30           case 320:  
31              return new BWM320();  
32           case 523:  
33              return new BMW523();  
34         //....  
35    }  
36 }  
37 /** 
38  *  
39  * 客户通过工厂获取车 
40  */  
41 class Customer {  
42     private $BMW;  
43     function getBMW($type){  
44         $this¬-> BMW =  Factory::createBMW($type);  
45     }  
46 }  

(2)工厂方法模式

 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     }  
20 }  
21 /** 
22  * 创建工厂的接口 
23  * 
24  */  
25 interface FactoryBMW {   
26        function createBMW();   
27 }   
28   
29   
30 /** 
31  *  
32  * 创建BWM320车 
33  */  
34 class FactoryBWM320 implements FactoryBMW {  
35    function  createBMW($type){  
36       return new BWM320();  
37    }  
38   
39 }  
40   
41   
42 /** 
43  *  
44  * 创建BWM523车 
45  */  
46 class FactoryBWM523 implements FactoryBMW {  
47    function  createBMW($type){  
48       return new BMW523();  
49    }  
50 }  
51 /** 
52  *  
53  * 客户得到车 
54  */  
55 class Customer {  
56    private $BMW;  
57    function  getBMW($type){  
58       switch ($type) {  
59         case 320:  
60            $BWM320 = new FactoryBWM320();  
61            return $BWM320->createBMW();  
62         case 523:  
63            $BWM523 = new FactoryBWM523();  
64            return $BWM320->createBMW();  
65             //....  
66       }  
67   
68   }  
69 }  
70 class Customer {  
71      private $BMW;  
72      function  getBMW($type){  
73          $class = new ReflectionClass('FactoryBWM' .$type );//建立 'FactoryBWM'这个类的反射类    
74           $instance  = $class->newInstanceArgs();//相当于实例化'FactoryBWM' .$type类    
75           return $instance->createBMW();  
76         //或者直接   
77          /** 
78          * $instance = new 'FactoryBWM' .$type(); 
79          * return $instance->createBMW(); 
80          */  
81     }  
82 }  

(3)抽象工厂模式

 1 <?php  
 2 /** 
 3  * 车子系列以及型号 
 4  * 
 5  */  
 6 abstract class  BWM{  
 7 }  
 8   
 9 class BWM523 extends  BWM {  
10 }  
11 class BWM320 extends  BWM {  
12   
13   
14 }  
15 /** 
16  * 空调 
17  * 
18  */  
19 abstract class aircondition{  
20 }  
21 class airconditionBWM320  extends aircondition {  
22   
23 }  
24 class airconditionBWM52 extends aircondition {  
25   
26 }  
27 /** 
28  * 创建工厂的接口 
29  * 
30  */  
31 interface FactoryBMW {   
32      function createBMW();   
33      function createAirC();   
34 }   
35   
36   
37 /** 
38  *  
39  * 创建BWM320车 
40  */  
41 class FactoryBWM320 implements FactoryBMW {  
42     function  createBMW(){  
43         return new BWM320();  
44     }  
45     function  createAirC(){ //空调  
46         return new airconditionBWM320();  
47     }  
48 }  
49   
50   
51 /** 
52  *  
53  * 创建BWM523车 
54  */  
55 class FactoryBWM523 implements FactoryBMW {  
56     function  createBMW(){  
57         return new BWM523();  
58     }  
59     function  createAirC(){  
60         return new airconditionBWM523();  
61     }  
62 }  
63 /** 
64  *  
65  * 客户得到车 
66  */  
67 class Customer {  
68    private $BMW;  
69    private $airC;  
70    function  getBMW($type){  
71        $class = new ReflectionClass('FactoryBWM' .$type );//建立 Person这个类的反射类    
72         $instance  = $class->newInstanceArgs();//相当于实例化Person 类    
73         $this->BMW =  $instance->createBMW();  
74        $this->airC =  $instance->createAirC();  
75    }  
76 }  

 

posted @ 2014-06-09 15:12  飛雲若雪  阅读(422)  评论(0编辑  收藏  举报