(四)抽象工厂模式

一、概念

抽象工厂模式就是能够生成工厂类的模式。类似于在工厂模式上再加一层封装,负责生成各种各样的工厂,可以视为建厂子的模式。

二、抽象工厂的使用

当一个工厂模式中生产的类有多重组合方式,例如工厂生产水果茶,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 可能生成另一组产品,如牛奶、杯子。

因此工厂方法模式、抽象工厂模式最大的区别在于:

工厂方法模式:针对的是 一个产品等级结构。

抽象工厂模式:针对 多个产品等级结构。

三、总结

抽象工厂作为基类,并设计好了这一类工厂应该具有的特征,每类工厂继承基类,并实现基类的生产函数即可。

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