1. 程式人生 > >抽象工廠--設計模式

抽象工廠--設計模式

前面工廠方法模式中考慮的是一類產品的生產, 如畜牧場只管動物、電視機廠只產電視機等.

同種類稱為同等級, 也就是說,工廠方法模式只會考慮生產同等級的產品,但是在現實生活中許多工廠都是綜合性很強的,也會加大工廠的最大使用效率,能夠生產出多等級的產品. 畜牧場可以養動物,也可以養植物等.

本篇部落格將講述抽象工廠方法模式.抽象工廠模式將考慮多等級的產品同時生產,將處於同一個具體工廠所生產的不同等級的產品作為一個產品族. 

模式的定義與特點

定義

是一種為訪問類建立一組相關或者相互依賴的介面,並且訪問類不需要制定所要的產品的具體類就可以得到同族不同等級的產品模式結構.

抽象工廠模式一般都是工廠模式的升級, 工廠模式只生產一個等級的產品,而抽象工廠模式可生產多個等級的產品.

特點

使用抽象工廠模式一般要滿足如下條件.

  • 系統中有許多個產品族,每個具體工廠建立統一族但又屬於不同等級結構的產品.

抽象工廠有工廠模式的優點之外,還主要有以下優點:

  • 可在類的內部對產品族中相關聯的等級產品進行共同管理,並且不需要引入多個類來進行管理.
  • 當增加一個產品族時,不需要更改原來的程式碼,滿足了開閉原則.

抽象工廠缺點:

  • 當產品族中需要增加新的產品時,所有的工廠類都需要更改

 

模式的結構和實現

抽象工廠和工廠方法一樣,都是由抽象工廠、具體工廠、抽象產品和具體產品4個要素組成,但是抽象工廠中方法個數有所不同,抽象的產品也會有不同.

結構:

模式的主要角色如下:

  1. 抽象工廠: 提供了建立產品的介面,包含了多個建立產品的方法,也可以建立多個不同等級的產品.
  2. 具體工廠: 實現抽象工廠的多個抽象方法, 完成具體產品的建立.
  3. 抽象產品: 定義了產品規範, 描述產品的主要特性和功能, 抽象工廠模式有多個的抽象產品.
  4. 具體產品: 實現了抽象產品定義的介面, 具體工廠來建立, 同具體工廠的關係是多對一.

結構圖如下:

模式的實現

上面的圖可發現,抽象工廠和工廠方法有些類似,不同的是產品種類不止一個, 所以建立產品方法也不止一個.

抽象工廠: 提供了產品的生產方法

interface AbstractFactory
{
    public Product1 newProduct1();
    public Product2 newProduct2();
}

具體工廠: 實現產品的生產

class ConcreteFactory1 implements AbstractFactory
{
    public Product1 newProduct1()
    {
        System.out.println("具體工廠 1 生成-->具體產品 11...");
        return new ConcreteProduct11();
    }
    public Product2 newProduct2()
    {
        System.out.println("具體工廠 1 生成-->具體產品 21...");
        return new ConcreteProduct21();
    }
}

 

模式應用例項 

[例1] 抽象工廠設計牧場類.

分析: 農場除了畜牧業可以養動物,也可以養植物,並且也可以種其他的.

抽象工廠模式設計兩個牧場, 一個農場用於養牛和種菜 ,一個用於養馬和種水果.

可以在兩個農場定義生成動物的方法和培養植物的演算法.

設計如下結構圖:

程式碼如下:

//抽象產品:動物類
interface Animal
{
    public void show();
}

//具體產品:馬類
class Horse implements Animal
{

    public void show()
    {
        jf.setVisible(true);
    }
}

//具體產品:牛類
class Cattle implements Animal
{
   
    public void show()
    {
        jf.setVisible(true);
    }
}

//抽象產品:植物類
interface Plant
{
    public void show();
}
//具體產品:水果類
class Fruitage implements Plant
{    
    public void show()
    {
        jf.setVisible(true);
    }
}
//具體產品:蔬菜類
class Vegetables implements Plant
{
    public void show()
    {
        jf.setVisible(true);
    }
}
//抽象工廠:農場類
interface Farm
{
    public Animal newAnimal();
    public Plant newPlant();
}
//具體工廠:農場類1
class SGfarm implements Farm
{
    public Animal newAnimal()
    {
        System.out.println("新牛出生!");
        return new Cattle();
    }
    public Plant newPlant()
    {
        System.out.println("蔬菜長成!");
        return new Vegetables();
    }
}
//具體工廠:農場類2
class SRfarm implements Farm
{
    public Animal newAnimal()
    {
        System.out.println("新馬出生!");
        return new Horse();
    }
    public Plant newPlant()
    {
        System.out.println("水果長成!");
        return new Fruitage();
    }
}

 

模式的應用場景

抽象工廠模式一般適用於如下場景:

  1. 當需要建立的物件是一系列的相互關聯或者依賴的產品族時. 例如工廠中的電視機,收音機以及空調等
  2. 系統有多個產品族, 但每次只使用其中的某一族產品時. 如有人只希望某種品牌的衣服和鞋子
  3. 系統提供了產品的類庫, 所有產品的介面都相同. 

模式的拓展:

  1. 當增加了一個新的產品族時只需要增加一個新的具體實現工廠,不需要更改原來的程式碼,滿足了開閉原則
  2. 當產品族需要增加一個新種類的產品時, 所有的工廠類都需要更改,不符合開閉原則
  3. 當只存在了一個等級結構的產品時,也就退化到了工廠模式的結構.

 

以上就是抽象工廠的理論和實踐模式的內容,希望對大家有所幫助!!!