意圖
在用戶端不必指定産品的具體類型的情況下,建立多個産品族中的一族産品。 産品族即一系列相關或互相依賴的産品組成的家族。
抽象工廠模式的結構

類圖與角色
工廠接口(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、系統提供了一個産品類的庫,所有的産品以同樣的接口出現,進而使用戶端不依賴于實作。