设计模式---抽象工厂模式
2017-10-11 15:42
183 查看
定义
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。理解
抽象工厂模式中有两个比较重要的概念:产品等级结构、产品族。产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是汽车,子类有丰田汽车、奔驰汽车、宝马汽车,则汽车和具体品牌的汽车构成了产品等级结构。
产品族:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。例如丰田工厂生产的丰田发动机,丰田变速箱,丰田底盘。
抽象工厂模式与工厂方法模式最大的不同在于,工厂方法模式针对的是同一产品等级结构,而抽象工厂模式针对的是产品族。
抽象工厂模式和工厂模式一样都有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()),具体工厂覆盖这些方法来创建具体的产品。这其实就用到了工厂方法模式。抽象工厂模式针对的是产品族,而工厂方法模式针对的是产品等级结构: 抽象工厂模式中,每个具体工厂可以实例化一系列对象,而工厂方法模式中的具体工厂只能创建一个具体产品实例。
抽象工厂模式中有多个抽象产品,而工厂方法模式中只有一个。
相关文章推荐
- [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式
- 设计模式-抽象工厂模式
- 设计模式-----抽象工厂模式
- 设计模式--创建模式--抽象工厂模式
- 设计模式之抽象工厂模式
- 设计模式(二)工厂方法模式+抽象工厂模式
- Java设计模式 -- 抽象工厂模式
- JAVA设计模式之3-抽象工厂模式
- C++设计模式的AbstractFactory(抽象工厂模式)图解
- Java开发之设计模式--抽象工厂模式(Abstract Factory)
- C#设计模式(4)——抽象工厂模式
- 设计模式学习总结-抽象工厂模式(Abstract Factory Pattern)
- 23种设计模式之--抽象工厂模式
- http://icyfenix.iteye.com/blog/575046 //设计模式--抽象工厂模式
- java设计模式之抽象工厂模式
- 设计模式之抽象工厂模式
- C# 设计模式----抽象工厂模式
- 设计模式之(二)——抽象工厂模式
- C++设计模式之抽象工厂模式(二)
- 23种设计模式三:创建型抽象工厂模式