您的位置:首页 > 其它

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

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()),具体工厂覆盖这些方法来创建具体的产品。这其实就用到了工厂方法模式。

抽象工厂模式针对的是产品族,而工厂方法模式针对的是产品等级结构: 抽象工厂模式中,每个具体工厂可以实例化一系列对象,而工厂方法模式中的具体工厂只能创建一个具体产品实例。

抽象工厂模式中有多个抽象产品,而工厂方法模式中只有一个。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: