漫畫:設(shè)計模式之 “工廠模式”


—————? 第二天? —————







————————————







ClassA?a?=?new?ClassA();
ClassB?b?=?new?ClassB();







假設(shè)我們的業(yè)務(wù)代碼當(dāng)中,有一個被廣泛引用的“口罩類”,這個類實例需要在許多地方被創(chuàng)建和初始化,而初始化的代碼也比較復(fù)雜。
public?class?Mask?{
????//構(gòu)造函數(shù)
????public?Mask(){
????????//?.....
????????//?100行初始化代碼
????}
}
針對這種情況,我們可以構(gòu)建一個“口罩工廠”專門負(fù)責(zé)創(chuàng)建口罩對象,把口罩的初始化代碼遷移到工廠類的創(chuàng)建方法當(dāng)中:
public?class?MaskFactory?{
????public?Mask?createMask()?{
????????Mask?mask?=?new?Mask();
????????//?.....
????????//?100行初始化代碼
????????return?mask;
????}
}

假設(shè)口罩類只是一個抽象接口,有兩個子類“高端口罩”和“低端口罩”分別實現(xiàn)了這個接口:
public?interface?IMask?{
????void?show();
}
public?class?HighEndMask?implements?IMask?{
????@Override
????public?void?show()?{
????????System.out.println("我是高端口罩");
????}
}
public?class?LowEndMask?implements?IMask?{
????@Override
????public?void?show(){
????????System.out.println("我的低端口罩");
????}
}
那么口罩工廠該如何創(chuàng)建這兩種類型的口罩呢?
很簡單,在創(chuàng)建方法中傳入?yún)?shù)(這里的參數(shù)是type),根據(jù)參數(shù)來做條件判斷,決定創(chuàng)建什么樣的口罩:
public?class?MaskFactory{
????public?IMask?createMask(String?type)?{
????????IMask?mask?=?null;
????????if("高端口罩".equals(type)){
????????????mask?=?new?HighEndMask();
????????????//?.....
????????????// HighEndMask的100行初始化代碼
????????}else?if("低端口罩".equals(type)){
????????????mask?=??new?LowEndMask();
????????????//?.....
????????????// LowEndMask的100行初始化代碼
????????}
????????return?mask;
????}
}
在客戶端,想要創(chuàng)建什么樣的口罩對象,只需傳入對應(yīng)的類型名稱:
public?class?Test?{
????public?static?void?main(String[]?args)?{
????????MaskFactory?factory?=?new?MaskFactory();
????????IMask?maskA?=?factory.createMask("高端口罩");
????????IMask?maskB?=?factory.createMask("低端口罩");
????????maskA.show();
????????maskB.show();
????}
}



(注:所謂面向?qū)ο蟮拈_放-封閉原則,就是在程序中對“擴展”開放,對“修改”封閉。如果每次業(yè)務(wù)改動都要增加新的if-else,就涉及對舊有代碼的修改,不但容易出錯,可讀性也不好。)


讓我們根據(jù)這個思路,重構(gòu)一下工廠類的邏輯:
public?interface?IMaskFactory?{
????IMask?createMask();
}
public?class?HighEndFactory?implements?IMaskFactory{
????@Override
????public?IMask?createMask()?{
????????IMask?mask?=??new?HighEndMask();
????????//?.....
????????// HighEndMask的100行初始化代碼
????????return?mask;
????}
}
public?class?LowEndFactory?implements?IMaskFactory{
????@Override
????public?IMask?createMask()?{
????????IMask?mask?=??new?LowEndMask();
????????//?.....
????????//? LowEndMask的100行初始化代碼
????????return?mask;
????}
}
在代碼中,工廠類變成了抽象的接口,高端口罩工廠和低端口罩工廠這兩個子類分別實現(xiàn)了該接口。
在客戶端,想要創(chuàng)建什么樣的口罩對象,只需實例化不同的工廠子類,調(diào)用相同的創(chuàng)建方法,無需再傳入?yún)?shù):
public?class?Test?{
????public?static?void?main(String[]?args)?{
????????IMaskFactory?factoryA?=?new?LowEndFactory();
????????IMaskFactory?factoryB?=?new?HighEndFactory();
????????IMask?maskA?=?factoryA.createMask();
????????IMask?maskB?=?factoryB.createMask();
????????maskA.show();
????????maskB.show();
????}
}




推薦閱讀:
完全整理 | 365篇高質(zhì)技術(shù)文章目錄整理
專注服務(wù)器后臺技術(shù)棧知識總結(jié)分享
歡迎關(guān)注交流共同進步
碼農(nóng)有道?coding
碼農(nóng)有道,為您提供通俗易懂的技術(shù)文章,讓技術(shù)變的更簡單
嘿,你在看嗎
