六.Factory 工厂模式

Factory Method模式的概念

在大规模的系统开发过程中,考虑系统的灵活性,低耦合性,可扩展性等因素,常常不直接使用new来生成类的实例,而是通过一个叫做工厂 (Factory)的类来专门生成类的实例。Factory Method模式,在上述基础上,把类的实例生成的任务委让给子工厂去完成的一种设计方法,所以Factory Method模式又被称为多态工厂(Polymorphic Factory)模式。在Factory Method模式中,父工厂类只定义创建对象的公共接口,而子工厂类则负责生成具体的类的实例。
简单一点说,Factory Method模式就是生成类实例(对象)的一种方法

Factory Method用到以下几个概念:
- 父工厂类:定义创建类实例的接口
- 子工厂类:实现接口定义,生成具体的类的实例
- 具有继承关系的产品类:由子工厂类创建


下面举例说明。
有一系列的自动车产品Bus(公交 车),Truck(卡车);
它们需要由不同的工厂生产,但具有相同的生产流程。

为了以后扩展其他流水线,比如摩托车,我们需要一 种柔软的方案来实现自动车生产的过程。
为了实现这个需求,我们定义了:

CarFactory:定义自动车生产的接口规范。
BusFactory: 生产Bus。
TruckFactory:生产Truck。

Car:自动车父类,定义了自动车一些公共的属性与行为。
CarBus: 公交车,自动车的一种。
CarTruck:卡车,自动车的一种。


下面我们用Factory Method来实现以上模型。

  1. Factory Method模式的实现范 例  
  2. 工厂类定义:  
  3. 自动车工厂类CarFactory.java  
  4.   
  5. view plaincopy to clipboardprint?  
  6. abstract   class  CarFactory {     
  7.     //定义生产自动车生产的接口规范      
  8.     public  Car createCar();     
  9. }    
  10.   
  11. abstract   class  CarFactory {  
  12.     //定义生产自动车生产的接口规范   
  13.     public  Car createCar();  
  14. }  
  15.   
  16.   
  17.   
  18. 生产公交车的工厂类BusFactory.java  
  19.   
  20. view plaincopy to clipboardprint?  
  21. class  BusFactory  extends  CarFactory {     
  22.     public  Car createCar() {     
  23.         //生产公交车      
  24.         return   new  CarBus();     
  25.     }     
  26. }    
  27.   
  28. class  BusFactory  extends  CarFactory {  
  29.     public  Car createCar() {  
  30.         //生产公交车   
  31.         return   new  CarBus();  
  32.     }  
  33. }  
  34.   
  35.   
  36.   
  37. 生产卡车的工厂类 TruckFactory.java  
  38.   
  39. view plaincopy to clipboardprint?  
  40. class  TruckFactory  extends  CarFactory {     
  41.     public  Car createCar() {     
  42.         //生产卡车      
  43.         return   new  TruckBus();     
  44.     }     
  45. }    
  46.   
  47. class  TruckFactory  extends  CarFactory {  
  48.     public  Car createCar() {  
  49.         //生产卡车   
  50.         return   new  TruckBus();  
  51.     }  
  52. }  
  53.   
  54.   
  55.   
  56. 产品类定义:  
  57. 自动车父类Car.java  
  58. 为了简单起见, 只定义了一个方法返回自动车的种类。  
  59.   
  60. view plaincopy to clipboardprint?  
  61. public   class  Car {     
  62.     public  String getType() {     
  63.         return   "Car" ;     
  64.     }     
  65. }    
  66.   
  67. public   class  Car {  
  68.     public  String getType() {  
  69.         return   "Car" ;  
  70.     }  
  71. }  
  72.   
  73.   
  74.   
  75. 公交车类CarBus.java  
  76.   
  77. view plaincopy to clipboardprint?  
  78. public   class  CarBus  extends  Car {     
  79.     public  String getType() {     
  80.         return   "Bus" ;     
  81.     }     
  82. }    
  83.   
  84. public   class  CarBus  extends  Car {  
  85.     public  String getType() {  
  86.         return   "Bus" ;  
  87.     }  
  88. }  
  89.   
  90.   
  91.   
  92. 卡车类CarTruck.java  
  93.   
  94. view plaincopy to clipboardprint?  
  95. public   class  CarTruck  extends  Car {     
  96.     public  String getType() {     
  97.         return   "Truck" ;     
  98.     }     
  99. }    
  100.   
  101. public   class  CarTruck  extends  Car {  
  102.     public  String getType() {  
  103.         return   "Truck" ;  
  104.     }  
  105. }  
  106.   
  107.   
  108.   
  109. Client调用:通过工厂类生产不同的自动车  
  110. Client.java  
  111.   
  112. view plaincopy to clipboardprint?  
  113. public   class  Client {     
  114.     public   static   void  main(String[] args) {     
  115.         CarFactory factory = new  BusFactory();     
  116.         //生产公交车      
  117.         Car bus = factory.createCar();     
  118.         System.out.println("生产了:"  + bus.getType());     
  119.     
  120.         factory = new  TruckFactory();     
  121.         //生产卡车      
  122.         Car truck = factory.createCar();     
  123.         System.out.println("生产 了:"  + truck.getType());     
  124.   }     
  125. }    



执行Client,输出结果:

C:/FactoryMethod>javac *.java
C:/FactoryMethod>java Client
生产了:Bus
生产了:Truck
C:/FactoryMethod>


我们可以发现,在Client.java里调用时,可以通过共通的父类工厂CarFactory调用同一个createCar()接口方法 而取得不同的自动车对象(公交车对象,卡车对象)。
也就是说,可以通过Factory Method模式在不同的子工厂类生成具有统一界面接口的对象,一方面,可以不用关心产品对象的具体实现,简化和统一Client调用过程;另一方面,可 以让整个系统具有灵活的可扩展性,如上面的例子中,若要扩展生产摩托车的流水线,只要再实现一个摩托车类以及摩托车工厂类就行,而Client的调用方法 完全不需改变。

    在非常需要它们的情况下, 才会用它,因为它会带来复杂性,尤其是在一个正在演化的设计的初期。

Robert C. Martin 如是讲也

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值