意图
在客户端不必指定产品的具体类型的情况下,创建多个产品族中的一族产品。
产品族即一系列相关或相互依赖的产品组成的家族。
抽象工厂模式的结构
类图与角色
工厂接口(Factory):所有具体工厂必须实现的接口。为每种类型的产品至少定义一个工厂方法。
具体工厂(Concrete Factory):对Factory接口的实现。
产品接口(Product):所有具体产品必须实现的接口。每一种产品都定义一个产品接口。
具体产品(Concrete Product):对产品接口的实现。
示例
//产品接口
interface Engine{}//引擎
interface Wheel{}//轮子
//具体产品
class ChinaEngine implements Engine{}
class GermanyEngine implements Engine{}
class ChinaWheel implements Wheel{}
class AmericaWheel implements Wheel{}
//工厂接口
interface Manufacturer{//制造商
public Engine getEngine();
public Wheel getWheel();
}
//具体工厂
class DZManufacturer implements Manufacturer{//大众汽车制造商
@Override
public Engine getEngine(){
return new ChinaEngine();
}
@Override
public Wheel getWheel(){
return new ChinaWheel();
}
}
//具体工厂
class BMManufacturer implements Manufacturer{//宝马汽车制造商
@Override
public Engine getEngine(){
return new GermanyEngine();
}
@Override
public Wheel getWheel(){
return new AmericaWheel();
}
}
//客户端代码
class test {
public static void main (String[] args) throws java.lang.Exception {
Manufacturer manu=new DZManufacturer();
Car dz=new Car();
dz.setEngine(manu.getEngine());
dz.setWheel(manu.getWheel());
manu=new BMManufacturer();
System.out.println("大众汽车制造商生产的汽车:"+dz);
Car bm=new Car();
bm.setEngine(manu.getEngine());
bm.setWheel(manu.getWheel());
System.out.println("宝马汽车制造商生产的汽车:"+bm);
}
}
class Car {
private Engine engine;
private Wheel wheel;
public Engine getEngine(){
return this.engine;
}
public void setEngine(Engine engine){
this.engine=engine;
}
public Wheel getWheel(){
return this.wheel;
}
public void setWheel(Wheel wheel){
this.wheel=wheel;
}
@Override
public String toString(){
return "引擎:"+engine.getClass().getName()+"。轮胎:"+wheel.getClass().getName();
}
}
抽象工厂适用场景
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。
2、这个系统的产品有多个产品族,而系统只消费其中某一族产品。
3、同属于同一族的产品必须一起适用,并且这一约束需要在系统的设计中体现出来。
4、系统提供了一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。