天天看點

java抽象工廠模式(Abstract Factory)-建立型

意圖

在用戶端不必指定産品的具體類型的情況下,建立多個産品族中的一族産品。 産品族即一系列相關或互相依賴的産品組成的家族。

抽象工廠模式的結構

java抽象工廠模式(Abstract Factory)-建立型

類圖與角色

java抽象工廠模式(Abstract Factory)-建立型

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

繼續閱讀