
前言
工廠類負責把執行個體化類時,複雜的過程透明化,同時避免大量執行個體化類的重複代碼的出現。
定義
- 工廠方法模式(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 就可以完成建立的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度。
切記:不要過渡設計
結尾
如果覺得對你有幫助,可以多多評論,多多點贊哦,也可以到我的首頁看看,說不定有你喜歡的文章,也可以随手點個關注哦,謝謝。
我是不一樣的科技宅,每天進步一點點,體驗不一樣的生活。我們下期見!