設(shè)計(jì)模式<第一篇>:工廠模式

工廠模式在程序設(shè)計(jì)中是經(jīng)常用到的一個(gè)設(shè)計(jì)模式,它可以將系統(tǒng)的構(gòu)建過程和使用過程解耦。

工廠模式分為三種:

(1)簡(jiǎn)單工廠模式
(2)工廠方法模式
(3)抽象工廠模式

(1)簡(jiǎn)單工廠模式
圖片.png

場(chǎng)景:制作戴爾鼠標(biāo)和惠普鼠標(biāo)

分析:
(1)戴爾鼠標(biāo)和惠普鼠標(biāo)都是鼠標(biāo),其中都有“制作”這個(gè)行為;
(2)為了方便生產(chǎn),來一個(gè)工廠統(tǒng)一制造這兩種品牌鼠標(biāo);

定義一個(gè)鼠標(biāo)接口,聲明兩種鼠標(biāo)共同的行為doOption

public interface Mouse {

    public void doOption();

}

創(chuàng)建戴爾鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為

public class DellMouse implements Mouse {

    @Override
    public void doOption() {
        System.out.println("制作戴爾鼠標(biāo)");
    }
}

創(chuàng)建惠普鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為

public class HpMouse implements Mouse{

    @Override
    public void doOption() {
        System.out.println("制作惠普鼠標(biāo)");
    }
}

創(chuàng)建一個(gè)工廠,統(tǒng)一管理這兩種鼠標(biāo)

public class MouseFactory {

    private static Mouse mouse;

    /**
     *  簡(jiǎn)單工廠模式
     * @param flag 0:戴爾鼠標(biāo) 1:惠普鼠標(biāo)
     * @return
     */
    public static Mouse createMouse(int flag){
        switch (flag){
            case 0:
                mouse = new DellMouse();
                break;
            case 1:
                mouse = new HpMouse();
                break;
        }
        return mouse;
    }
}

使用

    Mouse mouse1 = MouseFactory.createMouse(0);
    mouse1.doOption();
    Mouse mouse2 = MouseFactory.createMouse(1);
    mouse2.doOption();

以上就是簡(jiǎn)單工廠模式了。

缺點(diǎn):生產(chǎn)哪種鼠標(biāo)由參數(shù)決定, 在使用的時(shí)候,參數(shù)的意義不明確,使用困難。

個(gè)人理解:雖然簡(jiǎn)單工廠模式有缺陷,但是如果需要區(qū)分的參數(shù)不是太多,并且添加注釋說面每個(gè)參數(shù)的意思也是可以這樣寫的。

(2)工廠方法模式
圖片.png

場(chǎng)景:和(1)類似, 也是生產(chǎn)兩種不同品牌的鼠標(biāo)。

分析:為了解決(1)中“參數(shù)的意義不明確”的弊端,可以將工廠分離,即工廠A專門生產(chǎn)戴爾鼠標(biāo),工廠B專門生產(chǎn)惠普鼠標(biāo)。

定義一個(gè)鼠標(biāo)接口,聲明兩種鼠標(biāo)共同的行為doOption

public interface Mouse {

    public void doOption();

}

創(chuàng)建戴爾鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為

public class DellMouse implements Mouse {

    @Override
    public void doOption() {
        System.out.println("制作戴爾鼠標(biāo)");
    }
}

創(chuàng)建惠普鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為

public class HpMouse implements Mouse{

    @Override
    public void doOption() {
        System.out.println("制作惠普鼠標(biāo)");
    }
}

定義一個(gè)專門生產(chǎn)戴爾鼠標(biāo)的工廠

public class DellMouseFactory implements MouseFactory {
    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }
}

定義一個(gè)專門生產(chǎn)惠普鼠標(biāo)的工廠

public class HpMouseFactroy implements MouseFactory {
    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }
}

使用

//工廠模式(生產(chǎn)哪種鼠標(biāo)由對(duì)象決定)
Mouse mouse1 = new DellMouseFactory().createMouse();
mouse1.doOption();
Mouse mouse2 = new HpMouseFactroy().createMouse();
mouse2.doOption();

優(yōu)點(diǎn):
(1)避免了簡(jiǎn)單工廠模式參數(shù)不清晰的問題;
(2)生產(chǎn)哪種品牌的鼠標(biāo)由工廠對(duì)象決定;

(3)抽象工廠模式
圖片.png

說明:
(1)當(dāng)抽象工廠模式的產(chǎn)品只有一個(gè)的時(shí)候,即變成工廠模式;
(2)當(dāng)工廠模式的產(chǎn)品變成多個(gè)時(shí),即變成抽象工廠模式;

場(chǎng)景:有兩個(gè)工廠,分別是戴爾工廠和惠普工廠,戴爾工廠生產(chǎn)對(duì)應(yīng)品牌的鼠標(biāo)和鍵盤,惠普工廠也生產(chǎn)對(duì)應(yīng)品牌的鼠標(biāo)和鍵盤;

定義一個(gè)鼠標(biāo)接口,聲明兩種鼠標(biāo)共同的行為doOption

public interface Mouse {

    public void doOption();

}

創(chuàng)建戴爾鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為

public class DellMouse implements Mouse {

    @Override
    public void doOption() {
        System.out.println("制作戴爾鼠標(biāo)");
    }
}

創(chuàng)建惠普鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為

public class HpMouse implements Mouse{

    @Override
    public void doOption() {
        System.out.println("制作惠普鼠標(biāo)");
    }
}

定義一個(gè)鍵盤接口,聲明兩種鼠標(biāo)共同的行為sayHi

public interface KeyBoard {
    void sayHi();
}

創(chuàng)建戴爾鍵盤對(duì)象,并實(shí)現(xiàn)其行為

public class DellKeyBoard implements KeyBoard{
    @Override
    public void sayHi() {
        System.out.println("我是戴爾鍵盤");
    }
}

創(chuàng)建惠普鍵盤對(duì)象,并實(shí)現(xiàn)其行為

public class HpKeyBoard implements KeyBoard {
    @Override
    public void sayHi() {
        System.out.println("我是惠普鍵盤");
    }
}

定義一個(gè)戴爾工廠,用來生產(chǎn)對(duì)應(yīng)品牌的鼠標(biāo)和鍵盤

public class DellFactory implements PcFactory {

    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }

    @Override
    public KeyBoard createKeyBoard() {
        return new DellKeyBoard();
    }
}

定義一個(gè)惠普工廠,用來生產(chǎn)對(duì)應(yīng)品牌的鼠標(biāo)和鍵盤

public class HpFactory implements PcFactory {
    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }

    @Override
    public KeyBoard createKeyBoard() {
        return new HpKeyBoard();
    }
}

使用

Mouse mouse5 = new DellFactory().createMouse();
mouse5.doOption();
KeyBoard keyBoard1 = new DellFactory().createKeyBoard();
keyBoard1.sayHi();
Mouse mouse6 = new HpFactory().createMouse();
mouse6.doOption();
KeyBoard keyBoard2 = new HpFactory().createKeyBoard();
keyBoard2.sayHi();
總結(jié):

(1)簡(jiǎn)單工廠模式,還是真的簡(jiǎn)單,用一個(gè)雜牌工廠類生產(chǎn)多個(gè)雜牌產(chǎn)品,在使用該模式的時(shí)候,需要傳遞一個(gè)參數(shù),這個(gè)參數(shù)用來區(qū)分不同的產(chǎn)品;
(2)工廠模式(工廠方法模式),用多個(gè)工廠分別生產(chǎn)不同品牌的單個(gè)產(chǎn)品;
(3)抽象工廠模式,用多個(gè)工廠分別生產(chǎn)不同品牌的多個(gè)產(chǎn)品;

[本章完...]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容