设计模式---抽象工厂模式

来源:互联网 发布:gmp软件 编辑:程序博客网 时间:2024/05/29 11:33

定义

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

理解

抽象工厂模式中有两个比较重要的概念:产品等级结构、产品族。

  • 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是汽车,子类有丰田汽车、奔驰汽车、宝马汽车,则汽车和具体品牌的汽车构成了产品等级结构。
  • 产品族:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。例如丰田工厂生产的丰田发动机,丰田变速箱,丰田底盘。

抽象工厂模式与工厂方法模式最大的不同在于,工厂方法模式针对的是同一产品等级结构,而抽象工厂模式针对的是产品族。

抽象工厂模式和工厂模式一样都有4个角色:抽象工厂、具体工厂、抽象产品、具体产品。
但是抽象工厂拥有多个抽象产品,而工厂方法模式只有一个。

工厂类性 抽象工厂 具体工厂 抽象产品 具体产品 工厂方法模式 1个 多个 1个 多个 抽象工厂模式 1个 多个 多个 多个

例子

拿汽车工厂来说

有三种产品:发动机、变速箱、底盘,以及两个工厂:A工厂、B工厂。其中A工厂生产A发动机、A变速箱、A底盘,而B工厂生产B发动机、B变速箱、B底盘。

其中:A发动机和B发动机是同一产品等级,A变速箱和B变速箱是同一产品等级,A底盘和B底盘是同一产品等级。这就构成了产品族,需要用到抽象产品模式。

UML图

这里写图片描述

代码

3种产品的产品接口:

public interface Engine {    public String getEngineName();}public interface GearBox {    public String getGearBoxName();}public interface Chassis {    public String getChassisName();}

2个工厂所生产的6个具体产品类:

public class EngineA implements Engine {    @Override    public String getEngineName() {        return "EngineA";    }}public class EngineB implements Engine {    @Override    public String getEngineName() {        return "EngineB";    }}public class GearBoxA implements GearBox {    @Override    public String getGearBoxName() {        return "GearBoxA";    }}public class GearBoxB implements GearBox {    @Override    public String getGearBoxName() {        return "GearBoxB";    }}public class ChassisA implements Chassis {    @Override    public String getChassisName() {        return "ChassisA";    }}public class ChassisB implements Chassis {    @Override    public String getChassisName() {        return "ChassisB";    }}

工厂抽象:

public interface CarFactory {    Engine createEngine();    GearBox createGearBox();    Chassis createChassis();}

2个具体工厂:

public class ACarFactory implements CarFactory {    @Override    public Engine createEngine() {        return new EngineA();    }    @Override    public GearBox createGearBox() {        return new GearBoxA();    }    @Override    public Chassis createChassis() {        return new ChassisA();    }}public class BCarFactory implements CarFactory {    @Override    public Engine createEngine() {        return new EngineB();    }    @Override    public GearBox createGearBox() {        return new GearBoxB();    }    @Override    public Chassis createChassis() {        return new ChassisB();    }}

测试:

CarFactory a = new ACarFactory();CarFactory b = new BCarFactory();Engine engine_a = a.createEngine();Engine engine_b = b.createEngine();GearBox gearBox_a = a.createGearBox();GearBox gearBox_b = b.createGearBox();Chassis chassis_a = a.createChassis();Chassis chassis_b = b.createChassis();Log.e("ZXK","engine_a:"+engine_a.getEngineName()+",engine_b:"+engine_b.getEngineName());        Log.e("ZXK","gearBox_a:"+gearBox_a.getGearBoxName()+",gearBox_b:"+gearBox_b.getGearBoxName());        Log.e("ZXK","chassis_a:"+chassis_a.getChassisName()+",chassis_b:"+chassis_b.getChassisName());

这里写图片描述

抽象工厂模式 和 工厂方法模式

  • 抽象工厂模式中用到了工厂模式:在抽象工厂模式中,抽象工厂接口中有抽象工厂方法(例如:createEngine()、createGearBox()、createChassis()),具体工厂覆盖这些方法来创建具体的产品。这其实就用到了工厂方法模式。
  • 抽象工厂模式针对的是产品族,而工厂方法模式针对的是产品等级结构: 抽象工厂模式中,每个具体工厂可以实例化一系列对象,而工厂方法模式中的具体工厂只能创建一个具体产品实例。
  • 抽象工厂模式中有多个抽象产品,而工厂方法模式中只有一个。
原创粉丝点击