設計模式——抽象工廠模式

抽象工廠模式:簡單的說,抽象工廠模式相對於工廠方法模式來講,就是工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的。在抽象工廠類中,客戶端不再需要進行對象的創建,而是具體的工廠類來進行創建,客戶端只負責對象的調用。

我們依舊以產品生產爲例,可以畫出如下抽象工廠模式生產的原理:
抽象工廠原理
  我們可以這樣想,ProductA和ProductB都有各自的生產屬性,即生產哪些內容。也即ProductA.java和ProductB.java。而生產ProductA和ProductB的工廠都需要一些特定的程序,也即方法。對應是FactoryMethod.java 。生產ProductA和ProductB中有兩個工廠可以供選擇,這兩個工廠都繼承生產A和B的方法。但是兩個工廠因生產工藝的差異導致生產出的A和B又不完全相同。所以又有1工廠生產的A和B,對應ConcreteF1ProductA.java 和ConcreteF1ProductB.java 2工廠生產的A和B對應ConcreteF2ProductA.java 和ConcreteF2ProductB.java。雖然兩個工廠生產的A和B工藝不同,但生產的A和B都有相同的屬性,所以生產中要繼承ProductA和ProductB。對於客戶選擇不同的代生產工廠,所以結果也不同。對應的是Client.java
根據原理可以寫如下示例:
ProductA.java

public interface ProductA {
    public String doOperation(String txt);
}

ProductB.java

public interface ProductB {
    public String doOperation(String txt);
}

FactoryMethod.java

public abstract class FactoryMethod {
    protected abstract ProductA factoryMethodProductA();
    protected abstract ProductB factoryMethodProductB();

    public String operation(String txt){
        ProductA productA =factoryMethodProductA();
        ProductB productB =factoryMethodProductB();
        return productA.doOperation(txt)+"---"+productB.doOperation(txt);
    }
}

ConcreteF1ProductA.java

public class ConcreteF1ProductA implements ProductA{
    public String doOperation(String txt){
        return "代工廠1生產A產品"+txt;
    }
}

ConcreteF1ProductB.java

public class ConcreteF1ProductB implements ProductB {
    public String doOperation(String txt){
        return "代工廠1生產B產品"+txt;
    }
}

ConcreteFactory1Method.java

public class ConcreteFactory1Method extends FactoryMethod{

    @Override
    protected ProductA factoryMethodProductA() {
        // TODO Auto-generated method stub
        return new ConcreteF1ProductA();
    }

    protected ProductB factoryMethodProductB() {
        // TODO Auto-generated method stub
        return new ConcreteF1ProductB();
    }

}

ConcreteF2ProductA.java

public class ConcreteF2ProductA implements ProductA {
    public String doOperation(String txt){
        return "代工廠2生產A產品"+txt;
    }
}

ConcreteF2ProductB.java

public class ConcreteF2ProductB implements ProductB{
    public String doOperation(String txt){
        return "代工廠2生產B產品"+txt;
    }
}

ConcreteFactory2Method.java

public class ConcreteFactory2Method extends FactoryMethod{

    protected ProductA factoryMethodProductA() {
        // TODO Auto-generated method stub
        return new ConcreteF2ProductA();
    }
    protected ProductB factoryMethodProductB() {
        // TODO Auto-generated method stub
        return new ConcreteF2ProductB();
    }

}

Client.java

public class Client {
    public static void main(String[] args) {
        FactoryMethod factoryMethod=new ConcreteFactory1Method();
        System.out.println(factoryMethod.operation("測試"));
        factoryMethod=new ConcreteFactory2Method();
        System.out.println(factoryMethod.operation("測試"));
    }
}

運行結果:

代工廠1生產A產品測試—代工廠1生產B產品測試
代工廠2生產A產品測試—代工廠2生產B產品測試

發佈了43 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章