抽象工厂
来源:互联网 发布: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(公交车)系列产品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
- public abstract class CarFactory {
- public static final int BUS_TRUCK = 1; //参数定义。生产非模型车。
- public static final int BUS_TRUCK_MODEL = 2; //参数定义。生产模型车。
- //定义生产公交车的接口
- public abstract AbstractBus createBus();
- //定义生产卡车的接口
- public abstract AbstractTruck createTruck();
- //管理子工厂类,根据参数调用不同的子工厂进行生产
- public static CarFactory getCarFactory(int carType) {
- switch (carType) {
- case BUS_TRUCK:
- return new BusTruckFactory();
- case BUS_TRUCK_MODEL:
- return new ModelFactory();
- default:
- return null;
- }
- }
- }
生产非模型车的工厂BusTruckFactory.java
- public class BusTruckFactory extends CarFactory {
- //生产公交车(非模型)
- public AbstractBus createBus() {
- return new Bus();
- }
- //生产卡车(非模型)
- public AbstractTruck createTruck() {
- return new Truck();
- }
- }
生产模型车的工厂ModelFactory.java
- public class ModelFactory extends CarFactory {
- //生产公交车模型
- public AbstractBus createBus() {
- return new ModelBus();
- }
- //生产卡车模型
- public AbstractTruck createTruck() {
- return new ModelTruck();
- }
- }
产品类定义:
Bus系列产品:
- public class AbstractBus {
- public String getType() {
- return "Abstract Bus";
- }
- }
真车:
- public class Bus extends AbstractBus {
- public String getType() {
- return "Bus";
- }
- }
模型车:
- public class ModelBus extends AbstractBus {
- public String getType() {
- return "ModelBus";
- }
- }
Truck系列产品:
- public class AbstractTruck {
- public String getType() {
- return "Abstract Truck";
- }
- }
真车:
- public class Truck extends AbstractTruck {
- public String getType() {
- return "Truck";
- }
- }
模型车:
- public class ModelTruck extends AbstractTruck {
- public String getType() {
- return "ModelTruck";
- }
- }
Client调用:
- public class Client {
- public static void main(String[] args) {
- //取得工厂对象
- CarFactory factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK);
- //生产公交车
- Bus bus = factory.createBus();
- System.out.println("生产了:" + bus.getType());
- //生产卡车
- Truck truck = factory.createTruck();
- System.out.println("生产了:" + truck.getType());
- //取得工厂对象
- factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK_MODEL);
- //生产公交车
- bus = factory.createBus();
- System.out.println("生产了:" + bus.getType());
- //生产卡车
- truck = factory.createTruck();
- System.out.println("生产了:" + truck.getType());
- }
- }
执行Client,输出结果:
生产了:Bus
生产了:Truck
生产了:ModelBus
生产了:ModelTruck
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 抽象工厂
- 黑马程序员——冒泡排序
- Android apply theme to a fragment
- 在window下获取电脑的MAC地址
- 最短的名字+csuoj+前缀树(字典树)
- 如何给单元格(表体)设置颜色
- 抽象工厂
- QML类型说明-Date
- WebBrowser.ExecWB的完整说明
- 设置Django 中的session过期时间的方法
- 可立即离开后记得发来看见了开发的了开发阶段
- 一窥随机化算法——舍伍德算法的应用
- win7 64位系统下进入debug
- Excel2007 vba弹出窗体 指定到 指定sheet
- Myeclipse代码debug调试