前言
工廠類負責把實例化類時,複雜的過程透明化,同時避免大量實例化類的重複代碼的出現。
定義
- 工廠方法模式(Factory method pattern)是一種實現了“工廠”概念的面向對象設計模式。
- 工廠方法模式就像其他創建型模式一樣,它解決了在不指定對象具體類型的情況下創建對象的問題。
- 工廠方法模式的實質是“定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類。工廠方法讓類的實例化推遲到子類中進行。
優點
- 工廠方法把類複雜的實例化過程進行封裝,方便需求方進行調用。
- 工廠方法減少了類實例化過程中的重複代碼,同時也方便修改類實例化的過程。
- 工廠方法遵循開閉原則,方便擴展新的產品,同時不影響舊的產品。
缺點
- 一旦需要增加新的產品時,都需要增加一個具體產品類和對應的工廠,會使得類的數量成倍增加,增加系統的複雜性。
應用場景
- 當一個類實例化的過程太複雜,並且該類使用頻繁。
- 需要靈活、可擴展的框架時,可以考慮採用工廠方法模式。
如何理解
今年互聯網的行情不行,大量的公司都開始裁員了,各大論壇都是哀嚎一片,xxx也不例外也被裁員了。這個可愁死了xxx。這個節骨眼上可咋辦呢,工作又不好找。
xxx經過一段時間深思熟慮,決定利用自己的專業。回家創業開一家電腦店,可以賣電腦、修電腦、裝監控、裝寬帶等等,想到這些xxx感受到了前途一片光明啊,露出了久違的笑容,立馬買了回家的車票,回家創業去了。
經過一段時間的折騰,xxx電腦店總算是開起來了,既然要賣電腦,自己造電腦賣肯定是不可能的,這個時候xxx去聯繫了聯想採購了10臺ThinkPad,同時聯繫了蘋果採購了10臺MacBookPro。就這樣店是開啟來了。
過了一段時間,有顧客就想買DELL的,也有的顧客想買ASUS,於是他就聯繫了對應的廠商採購的電腦,後來生意越來越好了,xxx總是疲於聯繫各大廠商採購電腦,但他一點沒覺得累。日子一天天的過,在不斷的往好的方向進展。xxx內心中總是感覺這一幕出現過。
小結
從上面的小故事簡單理解下:
工廠類把實例化類時,複雜的過程對需求方透明化,這樣需求方就可以快速的實例化所需的類並使用。同時對於新的產品,方便拓展,在原有的基礎之上增加就好,不需要修改原來的類。
翻譯如下:
我(需求方)向各大廠商(factory)採購電腦,我只需要知道,我想要何種品牌的電腦即可,然後找對應的工廠採購即可,我不需要關心廠商如何生產電腦(實例化的過程)的,對於生產電腦這個複雜的過程對於我來講是完全透明的,如果有客戶有新的需求,我直接聯繫對應的廠商進貨即可,原本的電腦還是可以正常的售賣。
UML
代碼示例
BaseComputer
public abstract class BaseComputer {
/**
* 開機
*/
protected abstract void turnOn();
}
MacBookPro
public class MacBookPro extends BaseComputer {
@Override
public void turnOn() {
System.out.println("MacBookPro 開機了");
}
}
ThinkPad
public class ThinkPad extends BaseComputer {
@Override
public void turnOn() {
System.out.println("ThinkPad 開機了");
}
}
BaseComputerFactory
public abstract class BaseComputerFactory {
/**
* 創建電腦
* @return 返回電腦
*/
protected abstract BaseComputer create();
}
AppleFactory
public class AppleFactory extends BaseComputerFactory {
@Override
public MacBookPro create() {
System.out.println("經過一系列複雜的過程創建");
return new MacBookPro();
}
}
LenovoFactory
public class LenovoFactory extends BaseComputerFactory {
@Override
public ThinkPad create() {
System.out.println("經過一系列複雜的過程創建");
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();
}
}
測試結果
經過一系列複雜的過程創建
MacBookPro 開機了
經過一系列複雜的過程創建
ThinkPad 開機了
注意事項
工廠方法作為一種創建類模式,在任何需要生成複雜對象的地方,都可以使用工廠方法模式。但是有一點需要注意的地方就是複雜對象適合使用工廠模式,而簡單對象,特別是只需要通過 new 就可以完成創建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度。
切記:不要過渡設計
結尾
如果覺得對你有幫助,可以多多評論,多多點贊哦,也可以到我的主頁看看,說不定有你喜歡的文章,也可以隨手點個關注哦,謝謝。
我是不一樣的科技宅,每天進步一點點,體驗不一樣的生活。我們下期見!