Abstract Factory模式

Factory Method模式的主要特点是通过工厂提供的方法生成类的对象,而具体的对象的生成工作被委让给(延迟到)子工厂,所以被称为工厂方法模式。
Abstract Factory模式与Factory Method很相似,都是通过工厂的方法生成目标类的对象,但它们之间的也存在一些区别。

Abstract Factory模式与Factory Method模式的主要区别:

- Factory Method采用的是工厂类继承机制(生成子工厂类,重载该工厂方法,在重载的方法中生成目标对象)。而Abstract Factory强调的是对象组合机制,由在父工厂内定义不同的“子工厂”对象来负责不同的目标对象的创建。再深入一点理解:
- Factory Method模式中,产品(目标对象)的使用者可能需要使用具体的子工厂来生成该产品;Abstract Factory模式则采用传参数的形式直接在父工厂内决定该产品对象应该由哪一个子工厂生产。也就是说,Abstract Factory模式中,跟客户打交道的只有抽象工厂与抽象产品,客户不需要知道产品由哪个工厂生产,也不需要知道被生产的是哪一种具体的产品。
- Factory Method模式中,省城的对象产品只限定于某一类产品;Abstract Factory模式则可以提供多个生产接口生成多类产品
- Abstract Factory模式Factory Method模式的更高层次的抽象,也更最具一般性。可以把Factory Method模式看作是Abstract Factory模式的一种特殊情况

简单一点说,Abstract Factory模式通过抽象工厂为客户(调用者)生成多类产品,抽象工厂负责管理子工厂对象,子工厂负责生成某一类具体的产品对象。

Abstract Factory模式的应用场景:

- 存在多类产品,并需要对这些产品区别对待处理:需要分别为这些产品定义2个以上的接口或抽象类
- 客户端只需要与最上层的工厂(抽象工厂),与最上层的抽象产品打交道

Abstract Factory用到以下几个概念: 
- 抽象工厂类(1个):定义创建不同类实例的多个接口;创建与管理子工厂对象,提供统一方法以取得不同的子工厂对象
- 子工厂类(多个):生成具体的类的实例
- 抽象产品类(多个):对产品的抽象
- 具有继承关系的具体的产品类(多个):继承自抽象产品类,它们之间一般存在或多或少的依耐关系

工厂与产品的关系可以用UML类图表示:












下面举例说明。

Abstract Factory模式的实现范例


有一类Bus(公交车)系列产品Bus,ModelBus;
与另一类Truck(卡车)系列产品Truck,ModelTruck;

其中Bus与Truck可以由同一个工厂BusTruckFactory生产;ModelBus与ModelTruck可以由同一个工厂ModelFactory生产。
BusTruckFactory工厂与ModelFactory工厂由总工厂CarFactory统一管理。
我们(客户)直接从CarFactory工厂定购Bus系列产品,与Truck(卡车)系列产品。

下面我们用Abstract Factory模式实现上面的过程

CarFactory:定义生产Bus和Truck的接口规范;管理BusTruckFactory与ModelFactory工厂。
BusTruckFactory:生产Bus和Truck的非模型车。
ModelFactory:生产Bus和Truck的模型车。

AbstractBus:公交车(包括模型与非模型车)父类
Bus:公交车。继承自AbstractBus类。
ModelBus:公交车模型。继承自AbstractBus类。

AbstractTruck:卡车(包括模型与非模型车)父类
Truck:卡车。继承自AbstractTruck类。
ModelTruck:卡车模型。继承自AbstractTruck类。

 

CarFactory.java

  1. public   abstract   class  CarFactory {  
  2.     public   static   final   int  BUS_TRUCK =  1 ;    //参数定义。生产非模型车。   
  3.     public   static   final   int  BUS_TRUCK_MODEL =  2  //参数定义。生产模型车。   
  4.       
  5.   
  6.     //定义生产公交车的接口   
  7.     public   abstract  AbstractBus createBus();  
  8.     //定义生产卡车的接口   
  9.     public   abstract  AbstractTruck createTruck();  
  10.   
  11.     //管理子工厂类,根据参数调用不同的子工厂进行生产   
  12.     public   static  CarFactory getCarFactory( int  carType) {  
  13.         switch  (carType) {  
  14.             case  BUS_TRUCK:  
  15.                 return   new  BusTruckFactory();  
  16.             case  BUS_TRUCK_MODEL:  
  17.                 return   new  ModelFactory();  
  18.             default :  
  19.                 return   null ;  
  20.         }  
  21.     }  
  22. }  
[java]  view plain copy
  1. public abstract class CarFactory {  
  2.     public static final int BUS_TRUCK = 1;   //参数定义。生产非模型车。  
  3.     public static final int BUS_TRUCK_MODEL = 2//参数定义。生产模型车。  
  4.       
  5.   
  6.     //定义生产公交车的接口  
  7.     public abstract AbstractBus createBus();  
  8.     //定义生产卡车的接口  
  9.     public abstract AbstractTruck createTruck();  
  10.   
  11.     //管理子工厂类,根据参数调用不同的子工厂进行生产  
  12.     public static CarFactory getCarFactory(int carType) {  
  13.         switch (carType) {  
  14.             case BUS_TRUCK:  
  15.                 return new BusTruckFactory();  
  16.             case BUS_TRUCK_MODEL:  
  17.                 return new ModelFactory();  
  18.             default:  
  19.                 return null;  
  20.         }  
  21.     }  
  22. }  



生产非模型车的工厂BusTruckFactory.java

  1. public   class  BusTruckFactory  extends  CarFactory {  
  2.     //生产公交车(非模型)   
  3.     public  AbstractBus createBus() {  
  4.         return   new  Bus();  
  5.     }  
  6.     //生产卡车(非模型)   
  7.     public  AbstractTruck createTruck() {  
  8.         return   new  Truck();  
  9.     }  
  10. }  
[java]  view plain copy
  1. public class BusTruckFactory extends CarFactory {  
  2.     //生产公交车(非模型)  
  3.     public AbstractBus createBus() {  
  4.         return new Bus();  
  5.     }  
  6.     //生产卡车(非模型)  
  7.     public AbstractTruck createTruck() {  
  8.         return new Truck();  
  9.     }  
  10. }  



生产模型车的工厂ModelFactory.java

  1. public   class  ModelFactory  extends  CarFactory {  
  2.     //生产公交车模型   
  3.     public  AbstractBus createBus() {  
  4.         return   new  ModelBus();  
  5.     }  
  6.     //生产卡车模型   
  7.     public  AbstractTruck createTruck() {  
  8.         return   new  ModelTruck();  
  9.     }  
  10. }  
[java]  view plain copy
  1. public class ModelFactory extends CarFactory {  
  2.     //生产公交车模型  
  3.     public AbstractBus createBus() {  
  4.         return new ModelBus();  
  5.     }  
  6.     //生产卡车模型  
  7.     public AbstractTruck createTruck() {  
  8.         return new ModelTruck();  
  9.     }  
  10. }  




产品类定义: 
Bus系列产品:

  1. public   class  AbstractBus {  
  2.     public  String getType() {  
  3.         return   "Abstract Bus" ;  
  4.     }  
  5. }  
  6.   
  7.   
  8. public   class  Bus  extends  AbstractBus {  
  9.     public  String getType() {  
  10.         return   "Bus" ;  
  11.     }  
  12. }  
  13.   
  14. public   class  ModelBus  extends  AbstractBus {  
  15.     public  String getType() {  
  16.         return   "ModelBus" ;  
  17.     }  
  18. }  
[java]  view plain copy
  1. public class AbstractBus {  
  2.     public String getType() {  
  3.         return "Abstract Bus";  
  4.     }  
  5. }  
  6.   
  7.   
  8. public class Bus extends AbstractBus {  
  9.     public String getType() {  
  10.         return "Bus";  
  11.     }  
  12. }  
  13.   
  14. public class ModelBus extends AbstractBus {  
  15.     public String getType() {  
  16.         return "ModelBus";  
  17.     }  
  18. }  



Truck系列产品:

  1. public   class  AbstractTruck {  
  2.     public  String getType() {  
  3.         return   "Abstract Truck" ;  
  4.     }  
  5. }  
  6.   
  7.   
  8. public   class  Truck  extends  AbstractTruck {  
  9.     public  String getType() {  
  10.         return   "Truck" ;  
  11.     }  
  12. }  
  13.   
  14. public   class  ModelTruck  extends  AbstractTruck {  
  15.     public  String getType() {  
  16.         return   "ModelTruck" ;  
  17.     }  
  18. }  
[java]  view plain copy
  1. public class AbstractTruck {  
  2.     public String getType() {  
  3.         return "Abstract Truck";  
  4.     }  
  5. }  
  6.   
  7.   
  8. public class Truck extends AbstractTruck {  
  9.     public String getType() {  
  10.         return "Truck";  
  11.     }  
  12. }  
  13.   
  14. public class ModelTruck extends AbstractTruck {  
  15.     public String getType() {  
  16.         return "ModelTruck";  
  17.     }  
  18. }  



Client调用:

  1. public   class  Client {  
  2.     public   static   void  main(String[] args) {  
  3.     //取得工厂对象   
  4.         CarFactory factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK);  
  5.         //生产公交车   
  6.         Bus bus = factory.createBus();  
  7.         System.out.println("生产了:"  + bus.getType());  
  8.         //生产卡车   
  9.         Truck truck = factory.createTruck();  
  10.         System.out.println("生产了:"  + truck.getType());  
  11.   
  12.     //取得工厂对象   
  13.         factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK_MODEL);  
  14.         //生产公交车   
  15.         bus = factory.createBus();  
  16.         System.out.println("生产了:"  + bus.getType());  
  17.         //生产卡车   
  18.         truck = factory.createTruck();  
  19.         System.out.println("生产了:"  + truck.getType());  
  20.   }  
  21. }  
[java]  view plain copy
  1. public class Client {  
  2.     public static void main(String[] args) {  
  3.     //取得工厂对象  
  4.         CarFactory factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK);  
  5.         //生产公交车  
  6.         Bus bus = factory.createBus();  
  7.         System.out.println("生产了:" + bus.getType());  
  8.         //生产卡车  
  9.         Truck truck = factory.createTruck();  
  10.         System.out.println("生产了:" + truck.getType());  
  11.   
  12.     //取得工厂对象  
  13.         factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK_MODEL);  
  14.         //生产公交车  
  15.         bus = factory.createBus();  
  16.         System.out.println("生产了:" + bus.getType());  
  17.         //生产卡车  
  18.         truck = factory.createTruck();  
  19.         System.out.println("生产了:" + truck.getType());  
  20.   }  
  21. }  



执行Client,输出结果:

C:/AbstractFactory>javac *.java
C:/AbstractFactory>java Client
生产了:Bus
生产了:Truck
生产了:ModelBus
生产了:ModelTruck
C:/FactoryMethod>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Abstract Factory 模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这个模式的主要目的是将客户端代码与具体类的创建分离,从而使客户端代码能够与抽象接口进行交互,而不是与具体实现进行交互。 ### 回答2: Abstract Factory 模式是一种软件设计模式,它提供了一种创建相关或依赖对象族的方法。它属于创建型模式的一种。 Abstract Factory 模式的核心思想是将具体对象的实例化操作封装到接口中,由工厂类来创建这些实例。这样可以隐藏对象的具体实现细节,使得系统更加灵活、可扩展和易于维护。 在 Abstract Factory 模式中,有四个角色: 1. 抽象工厂(Abstract Factory):定义了一系列创建抽象产品对象的方法,所有具体工厂类必须实现这些方法。 2. 具体工厂(Concrete Factory):实现了抽象工厂中定义的创建产品对象的方法,返回具体产品的实例。 3. 抽象产品(Abstract Product):定义了产品对象的通用接口,具体产品类必须实现这些接口。 4. 具体产品(Concrete Product):实现了抽象产品中定义的接口,是具体工厂创建的对象。 Abstract Factory模式是工厂方法模式的升级版,它在产品族的维度上进行了扩展。工厂方法模式只能创建单一类型的产品,而Abstract Factory模式能创建多个类型的产品。这使得Abstract Factory模式更加符合开闭原则,可以方便地扩展新的产品系列。 使用Abstract Factory模式可以将产品的创建和使用解耦,客户端只需要通过抽象接口来获取产品,不用关心具体的实现。同时,具体工厂负责创建产品,符合单一职责原则,提高了代码的可读性和可维护性。 总之,Abstract Factory模式提供了一种抽象的方式来创建相关的对象族,可以有效地降低系统的耦合性,提高系统的灵活性和可扩展性。但是它也增加了系统的复杂性,因此在设计系统时需要权衡利弊。 ### 回答3: Abstract Factory 模式是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的方法。它通过提供一个接口来创建一组相关的对象,而无需指定具体的类。 在 Abstract Factory 模式中,有一个抽象工厂类,它定义了创建对象的方法。具体的工厂类继承自抽象工厂类,并实现了其中的方法,用于创建具体的对象。每个具体工厂类创建一组相关的对象,这些对象在抽象工厂类中定义的接口下进行操作。 Abstract Factory 模式的最大优势是将客户端代码与具体类解耦,使得具体类的变化不会影响到客户端代码。客户端通过使用抽象工厂类和抽象产品类进行编程,而不是直接依赖于具体的对象。这样,如果需要更换一套创建对象的逻辑,只需要更换具体的工厂类即可,而无需修改客户端代码。这种灵活性使得 Abstract Factory 模式非常适合多对象产品系列的创建。 Abstract Factory 模式还可以保证创建的对象相互之间有关联,从而保持了系统的一致性。在具体工厂类中,只会创建相关的对象,并确保这些对象是一起工作的,它们之间有相互依赖关系。因此,使用 Abstract Factory 模式可以确保一组对象能够协同工作,实现系统的完整功能。 总而言之,Abstract Factory 模式通过提供一个接口来创建一组相关的对象,使得客户端代码与具体类解耦,并保持对象之间的关联。它能够提供灵活性和扩展性,适用于多对象产品系列的创建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值