漫畫:設(shè)計(jì)模式之 “工廠模式”
掃描二維碼
隨時(shí)隨地手機(jī)看文章
————— 第二天 —————
————————————
ClassA a = new ClassA();
ClassB b = new ClassB();
假設(shè)我們的業(yè)務(wù)代碼當(dāng)中,有一個(gè)被廣泛引用的“口罩類”,這個(gè)類實(shí)例需要在許多地方被創(chuàng)建和初始化,而初始化的代碼也比較復(fù)雜。
public class Mask {
//構(gòu)造函數(shù)
public Mask(){
// .....
// 100行初始化代碼
}
}
針對(duì)這種情況,我們可以構(gòu)建一個(gè)“口罩工廠”專門負(fù)責(zé)創(chuàng)建口罩對(duì)象,把口罩的初始化代碼遷移到工廠類的創(chuàng)建方法當(dāng)中:
public class MaskFactory {
public Mask createMask() {
Mask mask = new Mask();
// .....
// 100行初始化代碼
return mask;
}
}
假設(shè)口罩類只是一個(gè)抽象接口,有兩個(gè)子類“高端口罩”和“低端口罩”分別實(shí)現(xiàn)了這個(gè)接口:
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)建這兩種類型的口罩呢?
很簡(jiǎn)單,在創(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;
}
}
在客戶端,想要?jiǎng)?chuàng)建什么樣的口罩對(duì)象,只需傳入對(duì)應(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ū)ο蟮拈_放-封閉原則,就是在程序中對(duì)“擴(kuò)展”開放,對(duì)“修改”封閉。如果每次業(yè)務(wù)改動(dòng)都要增加新的if-else,就涉及對(duì)舊有代碼的修改,不但容易出錯(cuò),可讀性也不好。)
讓我們根據(jù)這個(gè)思路,重構(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;
}
}
在代碼中,工廠類變成了抽象的接口,高端口罩工廠和低端口罩工廠這兩個(gè)子類分別實(shí)現(xiàn)了該接口。
在客戶端,想要?jiǎng)?chuàng)建什么樣的口罩對(duì)象,只需實(shí)例化不同的工廠子類,調(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)注公眾號(hào) 程序員小灰,收看更多精彩內(nèi)容
點(diǎn)個(gè)[在看],是對(duì)小灰最大的支持!
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!