設計模式-工廠方法

設計模式-工廠方法

前言

  大家好我是不一樣的科技宅,每天進步一點點,體驗不一樣的生活。今天給大家帶來的是工廠方法,工廠方法是一種創建型模式。工廠類負責把實例化類時,複雜的過程透明化,同時避免大量實例化類的重複代碼的出現。

定義

  • 工廠方法模式(Factory method pattern)是一種實現了“工廠”概念的面向對象設計模式。
  • 工廠方法模式就像其他創建型模式一樣,它解決了在不指定對象具體類型的情況下創建對象的問題。
  • 工廠方法模式的實質是“定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類。工廠方法讓類的實例化推遲到子類中進行。

優點

  • 工廠方法把類複雜的實例化過程進行封裝,方便需求方進行調用。
  • 工廠方法減少了類實例化過程中的重複代碼,同時也方便修改類實例化的過程。
  • 工廠方法遵循開閉原則,方便擴展新的產品,同時不影響舊的產品。

缺點

  • 一旦需要增加新的產品時,都需要增加一個具體產品類和對應的工廠,會使得類的數量成倍增加,增加系統的複雜性。

應用場景

  • 當一個類實例化的過程太複雜,並且該類使用頻繁。
  • 需要靈活、可擴展的框架時,可以考慮採用工廠方法模式。

如何理解

  今年互聯網的行情不行,大量的公司都開始裁員了,各大論壇都是哀嚎一片,xxx也不例外也被裁員了。這個可愁死了xxx。這個節骨眼上可咋辦呢,工作又不好找。

設計模式-工廠方法

  xxx經過一段時間深思熟慮,決定利用自己的專業。回家創業開一家電腦店,可以賣電腦、修電腦、裝監控、裝寬帶等等,想到這些xxx感受到了前途一片光明啊,露出了久違的笑容,立馬買了回家的車票,回家創業去了。

  經過一段時間的折騰,xxx電腦店總算是開起來了,既然要賣電腦,自己造電腦賣肯定是不可能的,這個時候xxx去聯繫了聯想採購了10臺ThinkPad,同時聯繫了蘋果採購了10臺MacBookPro。就這樣店是開啟來了。

  過了一段時間,有顧客就想買DELL的,也有的顧客想買ASUS,於是他就聯繫了對應的廠商採購的電腦,後來生意越來越好了,xxx總是疲於聯繫各大廠商採購電腦,但他一點沒覺得累。日子一天天的過,在不斷的往好的方向進展。xxx內心中總是感覺這一幕出現過。

小結

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

  工廠類把實例化類時,複雜的過程對需求方透明化,這樣需求方就可以快速的實例化所需的類並使用。同時對於新的產品,方便拓展,在原有的基礎之上增加就好,不需要修改原來的類。

  翻譯如下:

  我(需求方)向各大廠商(factory)採購電腦,我只需要知道,我想要何種品牌的電腦即可,然後找對應的工廠採購即可,我不需要關心廠商如何生產電腦(實例化的過程)的,對於生產電腦這個複雜的過程對於我來講是完全透明的,如果有客戶有新的需求,我直接聯繫對應的廠商進貨即可,原本的電腦還是可以正常的售賣。

UML

設計模式-工廠方法

代碼示例

BaseComputer

<code>public abstract class BaseComputer {

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

}/<code>

MacBookPro

<code>public class MacBookPro extends BaseComputer {

    @Override
    public void turnOn() {
        System.out.println("MacBookPro 開機了");
    }
}/<code>

ThinkPad

<code>public class ThinkPad extends BaseComputer {

    @Override
    public void turnOn() {
        System.out.println("ThinkPad 開機了");
    }
}/<code>

BaseComputerFactory

<code>public abstract class BaseComputerFactory {

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

}/<code>

AppleFactory

<code>public class AppleFactory extends BaseComputerFactory {

    @Override
    public MacBookPro create() {
        System.out.println("經過一系列複雜的過程創建");
        return new MacBookPro();
    }

}/<code>

LenovoFactory

<code>public class LenovoFactory extends BaseComputerFactory {

    @Override
    public ThinkPad create() {
        System.out.println("經過一系列複雜的過程創建");
        return new ThinkPad();
    }
}/<code>

測試類

<code>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();
    }

}/<code>

測試結果

<code>經過一系列複雜的過程創建
MacBookPro 開機了

經過一系列複雜的過程創建
ThinkPad 開機了/<code>

注意事項

  工廠方法作為一種創建類模式,在任何需要生成複雜對象的地方,都可以使用工廠方法模式。但是有一點需要注意的地方就是複雜對象適合使用工廠模式,而簡單對象,特別是只需要通過 new 就可以完成創建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度。

切記:不要過渡設計

結尾

  如果覺得對你有幫助,可以多多評論,多多點贊哦,也可以到我的主頁看看,說不定有你喜歡的文章,也可以隨手點個關注哦,謝謝。


分享到:


相關文章: