設計模式3 抽象工廠模式(建立型模式)

2021-08-21 15:23:47 字數 1747 閱讀 5433

抽象工廠模式是工廠模式的公升級。相對而言,抽象工廠模式並不像工廠模式那麼好理解,看了不少網上部落格的描述,感覺都說說的雲裡霧裡,個人覺得還是把抽象問題具體化更好。推崇《大話設計模式》中的講解模式。本文講以更通俗的語言,結合《大話設計模式》中使用的例項,把抽象工廠模式理清楚。

先總結下個人對工廠模式的理解:

工廠模式中的類主要分兩大類群,一是產品類群,而是工廠類群。

工廠類群這邊,把生成產品的步驟,提取出來並做了抽象,即:工廠基類中抽象出的createoperation()方法,具體的建造過程是在具體產品對應的工廠類中實現的。

產品類群這邊,將所有產品所共有的一些行為抽象了出來,比如上圖中的operation()方法,某個具體產品是怎樣進行operation()的需要各個具體產品類自己去定義和實現。

總的來說,工廠模式是乙個具體的工廠類對於乙個具體產品類。當乙個工廠需要生產多個產品時,是不是就傻眼了?這時候就需要「抽象工廠模式」閃亮登場了。

實際專案工作中經常會涉及資料庫的讀寫,這必然要從多個主流的資料庫產品中選擇乙個,在自己的專案中使用。

乙個專案做好後,如果換個使用者,必然要對原專案進行修改,如果新使用者提出換一種資料庫,問題出來了:在專案的功能需求一致的情況下,資料庫中所要建立和使用的table的結構肯定是一樣的,資料處理邏輯也一樣,但是,不同型別的資料庫,比如oracle和access,具體的建表語句和訪問語句是不一樣的;如果,不提前抽象出建表邏輯、和資料處理邏輯,那在更換資料庫過程中,必然帶來龐大而混亂的工作量。

此時,我們就可以把一種資料庫(database)當做一種工廠(product creator),每個資料庫都對應有幾個相同的表要生成,所以,可以把待建的某個table當做成乙個product。

接著進行抽象操作:

產品端:每種產品都是一種table,對應同乙個表結構,每一種table又有多種不同database的實現形式

工廠端:每種工廠都是一種database,對應可以生成相同外觀的表,每一種database又可以生成多種table

以上是database-table的示例結構圖,將table轉化成product,database轉化中creator之後邊可得到抽象工廠模式的結構圖:

從專案中使用乙個新的資料庫(工廠)的角度,只需要新增乙個creator_3類,同時新增product_a_c3和product_b_c3;此時客戶端的呼叫中,只需要修改creator creator = new creator_3(),其他位置的呼叫無須修改,滿足「修改封閉-擴充套件開放」原則。

如果是專案中新增乙個product,則會麻煩一些,此時product端要新增對於多個creator的產品類;同時,creator端要對creator的結構進行調整,主要是新增creatpc()介面函式,各個creator實現類也要對應新增。客戶端的**裡也需要根據實際需要做修改。

3 建立型模式 抽象工廠模式

模式動機 工廠方法模式一般針對的是乙個產品等級結構 如僅生產電視機 而抽象工廠模式針對的是多個產品等級結構 如不僅生產電視機,還生產空調 模式定義 乙個具體工廠可以建立乙個產品族的所有產品,又稱為kit模式。模式結構圖 模式 bt 抽象工廠模式.h ifndef afp h define afp h...

設計模式 抽象工廠 建立型模式

介紹了簡單工廠與工廠方法之後,現在我們來看一下工廠三兄弟的最後乙個 抽象工廠。那什麼是抽象工廠呢?抽象工廠模式 abstract factory pattern 提供乙個建立一系列相關或相互依賴物件 的介面,而無須指定它們具體的類。抽象工廠模式又稱為kit模式,屬於物件建立型模式。說起來,抽象工廠與...

設計模式 建立型模式 工廠模式,抽象工廠模式

簡單工廠模式不是 23 種裡的一種,簡而言之,就是有乙個專門生產某個產品的類。它只算工廠模式的乙個特殊實現。簡單工廠模式在實際中的應用相對於其他2個工廠模式用的還是相對少得多,因為它只適應很多簡單的情況。1 建立shape介面 public inte ce shape 2 建立實現該介面的具體圖形類...