設計模式學習 抽象工廠模式

2022-02-12 18:53:38 字數 2048 閱讀 6747

模式概述

提供乙個建立一系列相關或相互依賴物件的介面,而無需制定它們具體的類,抽象工廠(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 使用,建立...