設計模式(五) 抽象工廠模式

2021-08-08 09:14:58 字數 3966 閱讀 8294

在設計模式(三)——工廠方法模式和設計模式(四)——jdk中的那些工廠方法中介紹了工廠方法模式。本文將介紹另外一種工廠模式——抽象工廠模式。

在介紹了簡單工廠模式和工廠方法模式之後,相信很多人對工廠模式(如果單獨提到工廠模式,即包括簡單工廠模式、工廠方法模式及本文即將介紹的抽象工廠模式)的思想都有了一定的理解。這裡我們在簡單回顧一下。

工廠模式的主要功能就是幫助我們例項化物件的。之所以名字中包含工廠模式四個字,是因為物件的例項化過程是通過工廠實現的,是用工廠方法代替new操作的。

這樣做的好處是封裝了物件的例項化細節,尤其是對於例項化較複雜或者物件的生命週期應該集中管理的情況。會給你系統帶來更大的可擴充套件性和盡量少的修改量。

優點:1、遮蔽產品的具體實現,呼叫者只關心產品的介面。

2、實現簡單

缺點:

1、增加產品,需要修改工廠類,不符合開放-封閉原則

2、工廠類集中了所有例項的建立邏輯,違反了高內聚責任分配原則

優點:1、繼承了簡單工廠模式的優點

2、符合開放-封閉原則

缺點:

1、增加產品,需要增加新的工廠類,導致系統類的個數成對增加,在一定程度上增加了系統的複雜性。

本文要介紹了抽象工廠模式,是在簡單工廠模式和工廠方法模式的基礎上衍生出的另外一種建立型設計模式。

抽象工廠模式提供了一種方式,可以將同一產品族的單獨的工廠封裝起來。在正常使用中,客戶端程式需要建立抽象工廠的具體實現,然後使用抽象工廠作為介面來建立這一主題的具體物件。客戶端程式不需要知道(或關心)它從這些內部的工廠方法中獲得物件的具體型別,因為客戶端程式僅使用這些物件的通用介面。抽象工廠模式將一組物件的實現細節與他們的一般使用分離開來。

抽象工廠模式和工廠方法模式一樣,都符合開放-封閉原則。但是不同的是,工廠方法模式在增加乙個具體產品的時候,都要增加對應的工廠。但是抽象工廠模式只有在新增乙個型別的具體產品時才需要新增工廠。也就是說,工廠方法模式的乙個工廠只能建立乙個具體產品。而抽象工廠模式的乙個工廠可以建立屬於一類型別的多種具體產品。工廠建立產品的個數介於簡單工廠模式和工廠方法模式之間。

在以下情況下可以使用抽象工廠模式:

乙個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,這對於所有型別的工廠模式都是重要的。

系統中有多於乙個的產品族,而每次只使用其中某一產品族。

屬於同乙個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。

系統提供乙個產品類的庫,所有的產品以同樣的介面出現,從而使客戶端不依賴於具體實現。

抽象工廠模式包含如下角色:

abstractfactory(抽象工廠):用於宣告生成抽象產品的方法

concretefactory(具體工廠):實現了抽象工廠宣告的生成抽象產品的方法,生成一組具體產品,這些產品構成了乙個產品族,每乙個產品都位於某個產品等級結構中;

abstractproduct(抽象產品):為每種產品宣告介面,在抽象產品中定義了產品的抽象業務方法;

product(具體產品):定義具體工廠生產的具體產品物件,實現抽象產品介面中定義的業務方法。

本文的例子採用乙個汽車代工廠造汽車的例子。假設我們是一家汽車代工廠商,我們負責給賓士和特斯拉兩家公司製造車子。我們簡單的把賓士車理解為需要加油的車,特斯拉為需要充電的車。其中賓士車中包含跑車和商務車兩種,特斯拉同樣也包含賓士車和商務車。

以上場景,我們就可以把跑車和商務車分別對待,對於跑車有單獨的工廠建立,商務車也有單獨的工廠。這樣,以後無論是再幫任何其他廠商造車,只要是跑車或者商務車我們都不需要再引入工廠。同樣,如果我們要增加一種其他型別的車,比如越野車,我們也不需要對跑車或者商務車的任何東西做修改。

下面是抽象產品,賓士車和特斯拉車:

public

inte***ce

benzcar

public

inte***ce

teslacar

下面是具體產品,賓士跑車、賓士商務車、特斯拉跑車、特斯拉商務車:

public

class

benzsportcar

implements

benzcar

}public

class

benzbusinesscar

implements

benzcar

}public

class

teslasportcar

implements

teslacar

}public

class

teslabusinesscar

implements

teslacar

}

下面是抽象工廠:

public

inte***ce

ca***ctory

下面是具體工廠:

public

class

sportca***ctory

implements

ca***ctory

public

teslacar

getteslacar()}

public

class

businessca***ctory

implements

ca***ctory

public

teslacar

getteslacar()}

「開閉原則」要求系統對擴充套件開放,對修改封閉,通過擴充套件達到增強其功能的目的。對於涉及到多個產品族與多個產品等級結構的系統,其功能增強包括兩方面:

增加產品族:對於增加新的產品族,工廠方法模式很好的支援了「開閉原則」,對於新增加的產品族,只需要對應增加乙個新的具體工廠即可,對已有**無須做任何修改。

增加新的產品等級結構:對於增加新的產品等級結構,需要修改所有的工廠角色,包括抽象工廠類,在所有的工廠類中都需要增加生產新產品的方法,不能很好地支援「開閉原則」。

抽象工廠模式的這種性質稱為「開閉原則」的傾斜性,抽象工廠模式以一種傾斜的方式支援增加新的產品,它為新產品族的增加提供方便,但不能為新的產品等級結構的增加提供這樣的方便。

當抽象工廠模式中每乙個具體工廠類只建立乙個產品物件,也就是只存在乙個產品等級結構時,抽象工廠模式退化成工廠方法模式;

抽象工廠模式與工廠方法模式最大的區別在於,工廠方法模式針對的是乙個產品等級結構,而抽象工廠模式則需要面對多個產品等級結構。

當工廠方法模式中抽象工廠與具體工廠合併,提供乙個統一的工廠來建立產品物件,並將建立物件的工廠方法設計為靜態方法時,工廠方法模式退化成簡單工廠模式。

抽象工廠模式提供乙個建立一系列相關或相互依賴物件的介面,而無須指定它們具體的類。抽象工廠模式又稱為kit模式,屬於物件建立型模式。

抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態。

抽象工廠模式的主要優點是隔離了具體類的生成,使得客戶並不需要知道什麼被建立,而且每次可以通過具體工廠類建立乙個產品族中的多個物件,增加或者替換產品族比較方便,增加新的具體工廠和產品族很方便;主要缺點在於增加新的產品等級結構很複雜,需要修改抽象工廠和所有的具體工廠類,對「開閉原則」的支援呈現傾斜性。

文中所有**見github

大話設計模式

深入淺出設計模式

抽象工廠模式(factory method pattern)

設計模式(五) 抽象工廠模式

為建立一組相關或者是相互依賴的物件提供乙個介面,而不需要指定它們的具體類。乙個物件族有相同的約束時可以使用抽象工廠模式。在工廠方法模式中,我們的具體建立者每次使用都只能建立乙個同型別的物件,假如我們現在需要的是多個不同型別的物件,工廠方法就滿足不了需求了。這時我們可以把多個工廠方法組合到乙個類,這就...

設計模式(五)抽象工廠模式

1.抽象工廠模式定義 抽象工廠模式可以說是是工廠方法模式的公升級版,當需要建立的產品有多個產品線 產品族 時使用抽象工廠模式是比較好的選擇。那什麼是多個產品線呢?拿我們在簡單工廠模式和工廠方法模式中學習的生產電腦的例子來舉例,我們一直都是生產聯想和惠普的電腦,但是電腦也有多個產品線 台式電腦 筆記本...

設計模式(五) 抽象工廠模式

一 抽象工廠模式基本介紹 1 抽象工廠模式 定義了乙個inte ce用於建立相關或有依賴關係的物件簇,而無需指明具體的類 2 抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整合 3 從設計層面看,抽象工廠模式就是對簡單工廠模式的改進 或者稱為進一步的抽象 4 將工廠抽象為兩層,absfactory...