當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 程序員小灰
[導(dǎo)讀]—————? 第二天? ————— ———————————— ClassA?a?=?new?ClassA(); ClassB?b?=?new?ClassB(); 假設(shè)我們的業(yè)務(wù)代碼當(dāng)中,有一個(gè)被廣泛引用的“口罩類”,這個(gè)類實(shí)例需要在許多地方被創(chuàng)建和初始化,而初始化的代碼也比較復(fù)雜。 public?class?



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



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


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)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉