設(shè)計(jì)模式-從開電腦店理解工廠方法

image

前言

??工廠類負(fù)責(zé)把實(shí)例化類時(shí),復(fù)雜的過程透明化,同時(shí)避免大量實(shí)例化類的重復(fù)代碼的出現(xiàn)。

定義

  • 工廠方法模式(Factory method pattern)是一種實(shí)現(xiàn)了“工廠”概念的面向?qū)ο笤O(shè)計(jì)模式。
  • 工廠方法模式就像其他創(chuàng)建型模式一樣,它解決了在不指定對(duì)象具體類型的情況下創(chuàng)建對(duì)象的問題。
  • 工廠方法模式的實(shí)質(zhì)是“定義一個(gè)創(chuàng)建對(duì)象的接口,但讓實(shí)現(xiàn)這個(gè)接口的類來決定實(shí)例化哪個(gè)類。工廠方法讓類的實(shí)例化推遲到子類中進(jìn)行。

優(yōu)點(diǎn)

  • 工廠方法把類復(fù)雜的實(shí)例化過程進(jìn)行封裝,方便需求方進(jìn)行調(diào)用。
  • 工廠方法減少了類實(shí)例化過程中的重復(fù)代碼,同時(shí)也方便修改類實(shí)例化的過程。
  • 工廠方法遵循開閉原則,方便擴(kuò)展新的產(chǎn)品,同時(shí)不影響舊的產(chǎn)品。

缺點(diǎn)

  • 一旦需要增加新的產(chǎn)品時(shí),都需要增加一個(gè)具體產(chǎn)品類和對(duì)應(yīng)的工廠,會(huì)使得類的數(shù)量成倍增加,增加系統(tǒng)的復(fù)雜性。

應(yīng)用場景

  • 當(dāng)一個(gè)類實(shí)例化的過程太復(fù)雜,并且該類使用頻繁。
  • 需要靈活、可擴(kuò)展的框架時(shí),可以考慮采用工廠方法模式。

如何理解

??今年互聯(lián)網(wǎng)的行情不行,大量的公司都開始裁員了,各大論壇都是哀嚎一片,xxx也不例外也被裁員了。這個(gè)可愁死了xxx。這個(gè)節(jié)骨眼上可咋辦呢,工作又不好找。

image

??xxx經(jīng)過一段時(shí)間深思熟慮,決定利用自己的專業(yè)?;丶?strong>創(chuàng)業(yè)開一家電腦店,可以賣電腦、修電腦、裝監(jiān)控、裝寬帶等等,想到這些xxx感受到了前途一片光明啊,露出了久違的笑容,立馬買了回家的車票,回家創(chuàng)業(yè)去了。

??經(jīng)過一段時(shí)間的折騰,xxx電腦店總算是開起來了,既然要賣電腦,自己造電腦賣肯定是不可能的,這個(gè)時(shí)候xxx去聯(lián)系了聯(lián)想采購了10臺(tái)ThinkPad,同時(shí)聯(lián)系了蘋果采購了10臺(tái)MacBookPro。就這樣店是開啟來了。

??過了一段時(shí)間,有顧客就想買DELL的,也有的顧客想買ASUS,于是他就聯(lián)系了對(duì)應(yīng)的廠商采購的電腦,后來生意越來越好了,xxx總是疲于聯(lián)系各大廠商采購電腦,但他一點(diǎn)沒覺得累。日子一天天的過,在不斷的往好的方向進(jìn)展。xxx內(nèi)心中總是感覺這一幕出現(xiàn)過。

小結(jié)

??從上面的小故事簡單理解下:

??工廠類把實(shí)例化類時(shí),復(fù)雜的過程對(duì)需求方透明化,這樣需求方就可以快速的實(shí)例化所需的類并使用。同時(shí)對(duì)于新的產(chǎn)品,方便拓展,在原有的基礎(chǔ)之上增加就好,不需要修改原來的類。

??翻譯如下:

??我(需求方)向各大廠商(factory)采購電腦,我只需要知道,我想要何種品牌的電腦即可,然后找對(duì)應(yīng)的工廠采購即可,我不需要關(guān)心廠商如何生產(chǎn)電腦(實(shí)例化的過程)的,對(duì)于生產(chǎn)電腦這個(gè)復(fù)雜的過程對(duì)于我來講是完全透明的,如果有客戶有新的需求,我直接聯(lián)系對(duì)應(yīng)的廠商進(jìn)貨即可,原本的電腦還是可以正常的售賣。

UML

image

代碼示例

BaseComputer

public abstract class BaseComputer {

    /**
     * 開機(jī)
     */
    protected abstract void turnOn();

}

MacBookPro

public class MacBookPro extends BaseComputer {

    @Override
    public void turnOn() {
        System.out.println("MacBookPro 開機(jī)了");
    }
}

ThinkPad

public class ThinkPad extends BaseComputer {

    @Override
    public void turnOn() {
        System.out.println("ThinkPad 開機(jī)了");
    }
}

BaseComputerFactory

public abstract class BaseComputerFactory {

    /**
     * 創(chuàng)建電腦
     * @return 返回電腦
     */
    protected abstract BaseComputer create();

}

AppleFactory

public class AppleFactory extends BaseComputerFactory {

    @Override
    public MacBookPro create() {
        System.out.println("經(jīng)過一系列復(fù)雜的過程創(chuàng)建");
        return new MacBookPro();
    }

}

LenovoFactory

public class LenovoFactory extends BaseComputerFactory {

    @Override
    public ThinkPad create() {
        System.out.println("經(jīng)過一系列復(fù)雜的過程創(chuàng)建");
        return new ThinkPad();
    }
}

測試類

public class Test {

    public static void main(String[] args) {
        AppleFactory appleFactory = new AppleFactory();
        MacBookPro macBookPro = appleFactory.create();
        macBookPro.turnOn();

        LenovoFactory lenovoFactory = new LenovoFactory();
        ThinkPad thinkPad = lenovoFactory.create();
        thinkPad.turnOn();
    }

}

測試結(jié)果

經(jīng)過一系列復(fù)雜的過程創(chuàng)建
MacBookPro 開機(jī)了

經(jīng)過一系列復(fù)雜的過程創(chuàng)建
ThinkPad 開機(jī)了

注意事項(xiàng)

??工廠方法作為一種創(chuàng)建類模式,在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠方法模式。但是有一點(diǎn)需要注意的地方就是復(fù)雜對(duì)象適合使用工廠模式,而簡單對(duì)象,特別是只需要通過 new 就可以完成創(chuàng)建的對(duì)象,無需使用工廠模式。如果使用工廠模式,就需要引入一個(gè)工廠類,會(huì)增加系統(tǒng)的復(fù)雜度。

切記:不要過渡設(shè)計(jì)

結(jié)尾

??如果覺得對(duì)你有幫助,可以多多評(píng)論,多多點(diǎn)贊哦,也可以到我的主頁看看,說不定有你喜歡的文章,也可以隨手點(diǎn)個(gè)關(guān)注哦,謝謝。

??我是不一樣的科技宅,每天進(jìn)步一點(diǎn)點(diǎn),體驗(yà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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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