模式概述:
提供乙個建立一系列相關或相互依賴物件的介面,而無需制定它們具體的類,抽象工廠(abstract factory)模式又稱為kit模式,屬於物件建立型模式。
抽象工廠模式與工廠方法模式最大的區別在於:工廠方法模式針對的是乙個產品等級結構,而抽象工廠模式則針對的是多個產品等級結構。所以在抽象工廠模式中經常會用到產品族這一概念,它指的是位於不同的產品等級結構中,並且功能互相關聯的產品系列。
uml類圖:
其中類與物件的關係為:
為了了解物件的建立和產品的生成過程,我們看一下抽象工廠典型應用的順序圖:
優勢劣勢:
抽象工廠模式主要優點是隔離了具體類的生成,使得客戶不需要知道什麼被建立了。由於這種隔離,使得更換乙個具體的工廠變得相對容易,該模式符合grasp純虛構的模式,實現了高內聚。主要缺點是,在新增新的產品物件時,難以擴充套件抽象工廠,因為抽象工廠介面規定了所有可能被建立的產品集合,如果要支援新種類的產品,需要對工廠介面進行擴充套件,這就涉及到修改既有**,違反了開閉原則。
應用場景:
系統需要遮蔽有關物件如何建立、如何組織和如何表示
系統需要由關聯的多個物件來構成
有關聯的多個物件需要一起應用並且它們的約束是強迫的,不可分離的
提供一組物件而不顯示它們的實現過程,只顯示它們的介面
應用示例:
下面實現乙個有資訊儲存和日誌儲存的小模組,要求該模組可以方便的將儲存的位置在資料庫和xml之間進行切換。
由於儲存的位置不定,所以資訊儲存和日誌儲存會針對不同的位置,有不同的處理形式,而針對一種儲存方式而言,資訊和日誌的儲存又形成一族,針對這些特點,我們採用抽象工廠模式來實現該模組。
首先,我們先將資訊儲存和日誌儲存抽象出來:
public
abstract
class messagedal
public
abstract
class logdal
然後,我們根據不同的儲存形式,分別實現抽象類:
public
class sqlmessagedal : messagedal
}public
class xmlmessagedal : messagedal
}public
class sqllogdal : logdal
}public
class xmllogdal : logdal
}下面就該實現我們的抽象工廠及實際工廠了:
public
abstract
class abstractfactory
public
class sqlfactory : abstractfactory
public
override logdal createlogdal()
}public
class xmlfactory : abstractfactory
public
override logdal createlogdal()
}客戶端呼叫如下:
class client
}至此我們的小模組實現完成了,儲存位置修改,只需生成不同的工廠例項就可以了。
實際的生產環境,我們肯定一般只需要儲存到乙個位置,上面的客戶端**為了演示,將2個位置都儲存了,**中,為了切換到xml儲存,我們還是修改了客戶端**,作為乙個有追求的碼農,這是我們不想看到的。所以,我們採用反射修改一下我們的客戶端呼叫**:
static
void main()
由於建立實際工廠採用了反射形式,所以現在我們可以通過配置檔案決定我們的儲存位置了,客戶端**也就無需修改了。這裡不在贅述...
設計模式學習 抽象工廠模式
抽象工廠模式,提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。抽象工廠模式的優點與缺點 優點 易於交換產品系列,由於具體工廠類在乙個應用中只需要在初始化的時候出現一次,這樣使得改變乙個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。它讓具體的建立例項過程與...
抽象工廠模式 設計模式學習
抽象工廠模式 abstract factory 提供乙個建立一系列相關或相互依賴物件的介面,而無需指定他們具體的類。以下給出抽象工廠方法模式的uml圖 回到 大話設計模式 裡面的雙資料庫訪問的例子 namespace set private string name public string nam...
設計模式 工廠模式 抽象工廠模式
建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...