• 设计模式---工厂模式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 }  
  • 相关阅读:
    Java 将File转换为MultipartFile类型
    JAVA中实现根据文件路径下载文件
    Java中类似单元格之间的计算公式解析,如A1+B3-B4
    Java JPA通过hql语句查询数据
    mysql与oracle 表字段定义比较
    Java时间日期DateUtil
    fetch缓存问题
    Vue中watch的简单应用
    关于跨域和如何解决跨域问题的小结
    Google play 一直等待下载?解决方案如此简单!
  • 原文地址:https://www.cnblogs.com/sydeveloper/p/3777911.html
Copyright © 2020-2023  润新知