抽象工厂

来源:互联网 发布:java base64 byte数组 编辑:程序博客网 时间:2024/06/05 20:48

Abstract Factory(抽象工厂)是创建模式中的一种设计模式,不直接通过对象的具体实现类,而是通过使用专门的类来负责一组相关联的对象的创建。

应用场景:

您只想暴露对象的接口而不想暴露具体的实现类,但是又想提供实例化对象的接口给用户;或者,您希望所有的对象能够集中在一个或一组类(通常称作工厂类)来创建,从而可以更方便的对对象的实例化过程进行动态配置(此时只需要修改工厂类的代码或配置)。

模式结构

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

维基百科上对其UML结构图的设计(如下)形象的展现了4种类的相互关系

Abstract Factory用到以下几个概念:

1抽象工厂类(1个)【AbstractFactory】:定义创建不同类实例的多个接口;创建与管理子工厂对象,提供统一方法以取得不同的子工厂对象;

2子工厂类(多个)【ConcreateFactory1、2】:生成具体的类的实例,提取每个抽象产品类的一种子类产品归为一组,封装到一个工厂中;

3抽象产品类(多个)【AbstarctProductA、B】:对产品的抽象;

4具有继承关系的具体的产品类(多个)【ProductA1、A2、B1、B2】:继承自抽象产品类,它们之间一般存在或多或少的依赖关系;

情景展现

Abstract Factory模式的实现范例

有一类Bus(公交车)系列产品BusModelBus

与另一类Truck(卡车)系列产品TruckModelTruck

其中BusTruck可以由同一个工厂BusTruckFactory生产;ModelBusModelTruck可以由同一个工厂ModelFactory生产。

BusTruckFactory工厂与ModelFactory工厂由总工厂CarFactory统一管理。

我们(客户)直接从CarFactory工厂定购Bus系列产品,与Truck(卡车)系列产品。

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

CarFactory:定义生产BusTruck的接口规范;管理BusTruckFactoryModelFactory工厂。

BusTruckFactory:生产BusTruck的非模型车。

ModelFactory:生产BusTruck的模型车。

AbstractBus:公交车(包括模型与非模型车)父类

Bus:公交车。继承自AbstractBus类。

ModelBus:公交车模型。继承自AbstractBus类。

AbstractTruck:卡车(包括模型与非模型车)父类

Truck:卡车。继承自AbstractTruck类。

ModelTruck:卡车模型。继承自AbstractTruck类。

工厂类定义:

总工厂CarFactory.java

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

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

[java] view plaincopy
  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

[java] view plaincopy
  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系列产品:

[java] view plaincopy
  1. public class AbstractBus {     
  2.     public String getType() {     
  3.        return "Abstract Bus";     
  4.     }     
  5. }     

真车:

[java] view plaincopy
  1. public class Bus extends AbstractBus {     
  2.     public String getType() {     
  3.         return "Bus";     
  4.     }     
  5. }     


模型车:

[java] view plaincopy
  1. public class ModelBus extends AbstractBus {     
  2.     public String getType() {     
  3.         return "ModelBus";     
  4.     }     
  5. }    


 

Truck系列产品:

[java] view plaincopy
  1. public class AbstractTruck {     
  2.     public String getType() {     
  3.        return "Abstract Truck";     
  4.    }     
  5. }     


真车:

[java] view plaincopy
  1. public class Truck extends AbstractTruck {     
  2.     public String getType() {     
  3.         return "Truck";     
  4.     }     
  5. }     


模型车:

[java] view plaincopy
  1. public class ModelTruck extends AbstractTruck {     
  2.     public String getType() {     
  3.         return "ModelTruck";     
  4.     }     
  5. }    


 

Client调用:

[java] view plaincopy
  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.         factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK_MODEL);     
  13.         //生产公交车     
  14.         bus = factory.createBus();     
  15.         System.out.println("生产了:" + bus.getType());     
  16.         //生产卡车     
  17.         truck = factory.createTruck();     
  18.         System.out.println("生产了:" + truck.getType());     
  19.   }     
  20. }    


 

执行Client,输出结果:

生产了:Bus

生产了:Truck

生产了:ModelBus

生产了:ModelTruck

0 0
原创粉丝点击