一、定義
為建立一組相關或者相互依賴的物件提供乙個介面,而且無須指定它們的具體類。
簡單的說,抽象工廠模式是工廠方法模式的公升級版本,當存在多個產品族時,產品族之間是存在相關或者依賴關係,可以使用抽象工廠來建立產品。
二、例項分析
網上已經有很多關於寶馬的抽象工廠的例子了,這裡我們不在累述。抽象工廠的起源或是更早的應用,是為了用於建立分屬於不同作業系統的視窗構建,如按鈕(button)、文字(text)等等。我們來分析另乙個例子:
例如乙個應用,需要在不同平台(windows、linux)上執行,你會怎麼設計?分別設計倆套不同應用?非也,通過抽象工廠模式遮蔽掉作業系統對應用的影響。軟體功能、邏輯、ui 都乙個非常類似,唯一的不同是呼叫不同的工廠方法,由不同的產品類去處理與作業系統互動的資訊。
1.產品族
產品族是一組存在相關關係的物件,上例中,我們存在兩個產品族,乙個是windows 產品族,另乙個是 linux 產品族。即
public inte***ce iwindowproduct
public inte***ce ilinuxproduct
假設現在我們有兩個具體的產品,按鈕和文字,那麼
public class windowsbutton implements iwindowproduct }
public class windowstext implements iwindowproduct }
public class linuxbutton implements ilinuxproduct }
public class linuxtext implements ilinuxproduct
}
2.工廠首先我們可以定義乙個工廠的介面,約束它能夠生產些什麼
public inte***ce ifactory
其次我們實現這個介面,完成具體的建立邏輯
public class productfactory implements ifactory catch (exception e)
return windowproduct;
}public t2 createlinuxproduct(classcls) catch (exception e)
return linuxproduct;}}
3.場景
public class client
}
執行結果為:
create a windows button
create a linux button
create a windows text
create a linux text
三、通用原始碼類圖分析
其中 abstractproducta 和 abstractproductb 就是兩個產品族抽象,例如 windows 產品族和 linux產品族。而 product1 和 product2 就是產品族下的具體產品類,例如 button、text、image 等等。abstractcreator 就是工廠的抽象。
四、抽象工廠特點
1.和工廠方法一樣,具有良好的封裝性,抽象工廠是工廠方法的公升級形式。
2.橫向擴充套件容易。例如增加乙個 image,我們只需要建立兩個具體的產品類 windowsimage 和 linuximage,然後由工廠建立即可。
3.縱向擴充套件困難。例如新增乙個新的產品族 android,abstractcreator 就需要對應增加乙個 createandroidproduct(),如果抽象工廠存在多個子類,那麼其所有子類也都要隨之更改,嚴重違背開閉原則。
設計模式(四) 抽象工廠模式
前面說了兩種設計模式,簡單工廠模式和工廠模式。簡單工廠模式是定義乙個工廠類,工廠類根據呼叫時傳入的引數選擇建立哪乙個類的例項。工廠模式是為每個類建立乙個工廠,而這些工廠都實現了同乙個工廠,客戶端在呼叫的時候自己選擇某個類對應的工廠去建立某個類的例項。那抽象工廠又是什麼呢?抽象工廠在工廠模式的基礎上引...
設計模式(四) 抽象工廠模式
有時候我們需要乙個工廠可以提供多個產品物件,而不是單一的產品物件。為了更清晰地理解工廠方法模式,這裡先引入兩個概念 產品等級結構 即產品的繼承結構,比如乙個抽象類是電視機,其子類有海爾電視機 海信電視機 tcl電視機,則抽象電視機與具體品牌的電視機之間構成了乙個產品等級結構,抽象電視機是父類,而具體...
設計模式(四) 抽象工廠模式
前面介紹的工廠方法模式中考慮的是一類產品的生產,如畜牧場只養動物 電視機廠只生產電視機 計算機軟體學院只培養計算機軟體專業的學生等。同種類稱為同等級,也就是說 工廠方法模式只考慮生產同等級的產品,但是在現實生活中許多任務廠是綜合型的工廠,能生產多等級 種類 的產品,如農場裡既養動物又種植物,電器廠既...