1. 程式人生 > >建立型: 抽象工廠模式(Abstract Factory Pattern)

建立型: 抽象工廠模式(Abstract Factory Pattern)

抽象工廠模式(Abstract Factory Pattern)

抽象工廠模式(Abstract Factory Pattern)為建立一組相關或相互依賴的物件提供一個介面,而且無需指定他們的具體類。抽象工廠模式屬於建立型模式,建立型模式包括FactoryMethod模式,Abstract Factory模式,Singleton模式,ProtoType模式和Builder模式。

模式簡介

抽象工廠模式是工廠方法模式的升級版本,他用來建立一組相關或者相互依賴的物件。他與工廠方法模式的區別就在於,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構。在程式設計中,通常一個產品結構,表現為一個介面或者抽象類,也就是說,工廠方法模式提供的所有產品都是衍生自同一個介面或抽象類,而抽象工廠模式所提供的產品則是衍生自不同的介面或抽象類。

GOF的《設計模式》指出抽象工廠模式的意圖是: 提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

工廠模式主要是為建立物件提供了介面。工廠模式按照抽象層次可分為以下幾類:簡單工廠模式(Simple Factory)、工廠方法模式(Factory Method)和抽象工廠模式(Abstract Factory)。

Abstract Factory模式適用於以下場景:

  • 一個系統要獨立於它的產品的建立、組合和表示時。
  • 一個系統要由多個產品系列中的一個來配置時。
  • 當你要強調一系列相關的產品物件的設計以便進行聯合使用時。
  • 當你提供一個產品類庫,而只想顯示它們的介面而不是實現時。

模式圖解

在抽象工廠模式中,有一個產品族的概念:所謂的產品族,是指位於不同產品等級結構中功能相關聯的產品組成的家族。抽象工廠模式所提供的一系列產品就組成一個產品族;而工廠方法提供的一系列產品稱為一個等級結構。我們依然拿生產汽車的例子來說明他們之間的區別。工廠方法模式的UML示例如下:

抽象工廠模式示例

抽象工廠模式的工作過程如下:

  • AbstractFactory類宣告一個建立抽象產品物件的操作介面;
  • ConcreteFactory類實現建立具體產品物件的操作;
  • AbstractProduct類聲明瞭抽象的物件宣告,即介面宣告;
  • ConcreteProduct類定義了具體工廠建立的產品物件,並實現了AbstractProduct介面;
  • Client類使用抽象介面實現功能(AbstractFactory/AbstractProduct)

抽象工廠模式的有益效果如下:

  • 系統依賴於抽象的類,具體的類之間鬆耦合。
  • 系統非常容易替換掉產品系列和工廠型別,更加配置替換工廠和產品型別也是可行的;
  • 系統一致性獲得增強,系統包含多種型別物件時,系統單次只能使用一種物件;
  • 難以支援新種類的產品, 並且難以擴充套件抽象工廠以生產新種類的產品。

模式例項

Android中介軟體中抽象工廠模式應用廣泛,例如:

  • ${android_sdk_root}/frameworks/av/media/libeffects/factory/EffectsFactory.c
  • ${android_sdk_root}/frameworks/av/media/