漫畫:設(shè)計模式之 “工廠模式”
掃描二維碼
隨時隨地手機看文章
————— 第二天 —————
————————————
ClassA a = new ClassA();
ClassB b = new ClassB();
假設(shè)我們的業(yè)務(wù)代碼當中,有一個被廣泛引用的“口罩類”,這個類實例需要在許多地方被創(chuàng)建和初始化,而初始化的代碼也比較復(fù)雜。
public class Mask {
//構(gòu)造函數(shù)
public Mask(){
// .....
// 100行初始化代碼
}
}
針對這種情況,我們可以構(gòu)建一個“口罩工廠”專門負責創(chuàng)建口罩對象,把口罩的初始化代碼遷移到工廠類的創(chuà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();
}
}
—————END—————
喜歡本文的朋友,歡迎關(guān)注公眾號 程序員小灰,收看更多精彩內(nèi)容
點個[在看],是對小灰最大的支持!
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!