(四)抽象工廠模式

一、概念

抽象工廠模式就是能夠生成工廠類的模式。類似於在工廠模式上再加一層封裝,負責生成各種各樣的工廠,可以視爲建廠子的模式。

二、抽象工廠的使用

當一個工廠模式中生產的類有多重組合方式,例如工廠生產水果茶,A廠產烏龍蜜桃茶,B廠產鐵觀音櫻桃茶,因此在抽象工廠類(作爲父類)中寫入茶+水果的組合,至於具體的哪種茶和哪種水果則交給由抽象工廠派生出來的A廠(子類)和B廠(子類)去搞定。

下面一段代碼說明:

假設我們有 A、B 兩個廚房。每個廚房都由餐具和食物組成,但具體組成不同,比如刀子和蘋果、杯子和牛奶。



interface Food {
    public String getFoodName();
}

interface TableWare {
    public String getToolName();
}

// 抽象工廠
interface KitchenFactory {
    public Food getFood();
    public TableWare getTableWare();
}


class Apple implements Food{
    public String getFoodName() {
        return "apple";
    }
}

class Knife implements TableWare { 
    public String getToolName() {
        return "knife";
    }
}

class AKitchen implements KitchenFactory {

    public Food getFood() {
       return new Apple();
    }

    public TableWare getTableWare() {
       return new Knife();
    }
}

public class Foodaholic {

    public void eat(KitchenFactory k) {
       System.out.println("A foodaholic is eating "+ k.getFood().getFoodName()
              + " with " + k.getTableWare().getToolName() );
    }

    public static void main(String[] args) {
       Foodaholic fh = new Foodaholic();
       KitchenFactory kf = new AKitchen();
       fh.eat(kf);
    }
}

如上,每個餐廳由餐具和食物組成,而具體的組成又不相同,因此使用一個抽象工廠類,並派生出A和B餐廳。使用時由抽象工廠類來執行具體的工作。另外這裏抽象工廠類並未負責工廠類的生成工作。

另外複製一段網上的話:

爲了解釋得更清楚,先介紹兩個概念:

產品等級結構:比如一個抽象類是食物,其子類有蘋果、牛奶等等,則抽象食物與具體食物名稱之間構成了一個產品等級結構。食物是抽象的父類,而具體的食物名稱是其子類。

產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品。如 AKitchen 生產的蘋果、刀子,蘋果屬於食物產品等級結構中,而刀子則屬於餐具產品等級結構中。而 BKitchen 可能生成另一組產品,如牛奶、杯子。

因此工廠方法模式、抽象工廠模式最大的區別在於:

工廠方法模式:針對的是 一個產品等級結構。

抽象工廠模式:針對 多個產品等級結構。

三、總結

抽象工廠作爲基類,並設計好了這一類工廠應該具有的特徵,每類工廠繼承基類,並實現基類的生產函數即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章