创建型模式---工厂模式
從簡單到復(fù)雜有簡單工廠模式-->工廠方法模式-->抽象工廠模式
簡單工廠模式(Simple Factory Pattern)
定義
又稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創(chuàng)建其他類的實例,被創(chuàng)建的實例通常都具有共同的父類。
產(chǎn)生背景
當一個模塊只需要一個工廠類,沒必要把工廠類也抽象出來的時候,使用靜態(tài)方法就行。就像規(guī)模小的時候,各種產(chǎn)品都在一個工廠里混著生產(chǎn),有點類似小作坊。
UML圖
代碼
public class SimpleDrinkFactory {public static <T extends Drink> T getDrink(Class<T> c) {//定義一個飲料Drink drink = null;try {drink = (Drink) Class.forName(c.getName()).newInstance();} catch (Exception e) {System.out.println("生產(chǎn)飲料失敗!");}return (T) drink;} }public class SimpleDrinkFactoryTest {@Testpublic void test() {Drink wine = SimpleDrinkFactory.getDrink(Wine.class);wine.getName();Drink milk = SimpleDrinkFactory.getDrink(Milk.class);milk.getName();Drink juice = SimpleDrinkFactory.getDrink(Juice.class);juice.getName();} }使用場景:
工廠方法模式(Factory Method Pattern)
意圖
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。 Factory Method使一個類的實例化延遲到其子類。
適用性
在下列情況下可以使用 Factory Method模式:
- 當一個類不知道它所必須創(chuàng)建的對象的類的時候。
- 當一個類希望由它的子類來指定它所創(chuàng)建的對象的時候。
- 當類將創(chuàng)建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
結(jié)構(gòu)
參與者
- P r o d u c t( D o c u m e n t )
-- 定義工廠方法所創(chuàng)建的對象的接口。 - C o n c r e t e P r o d u c t(M y D o c u m e n t)
-- 實現(xiàn)P r o d u c t接口。 - C r e a t o r(A p p l i c a t i o n)
-- 聲明工廠方法,該方法返回一個 P r o d u c t類型的對象。 C r e a t o r也可以定義一個工廠方法的缺省實現(xiàn),它返回一個缺省的 C o n c r e t e P r o d u c t對象。
-- 可以調(diào)用工廠方法以創(chuàng)建一個 P r o d u c t對象。 - C o n c r e t e C r e a t o r(M y A p p l i c a t i o n)
-- 重定義工廠方法以返回一個 C o n c r e t e P r o d u c t實例。
協(xié)作
- Creator依賴于它的子類來定義工廠方法,所以它返回一個適當?shù)?C o n c r e t e P r o d u c t實例。
抽象工廠模式(Abstract Factory Pattern)
意圖
提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。重點在于在于一系列、相關(guān)(相互依賴)兩個詞。
結(jié) 構(gòu)
適用性
在以下情況可以使用 Abstract Factory模式
- 一個系統(tǒng)要獨立于它的產(chǎn)品的創(chuàng)建、組合和表示時。
- 一個系統(tǒng)要由多個產(chǎn)品系列中的一個來配置時。
- 當你要強調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進行聯(lián)合使用時。
- 當你提供一個產(chǎn)品類庫,而只想顯示它們的接口而不是實現(xiàn)時。
舉例
知乎上有個很好的例子,就是遠程武器的例子,比如手槍、步槍、打炮、弩。這些武器的生產(chǎn)工廠不止生產(chǎn)武器,同時生產(chǎn)配套的彈藥(箭矢),這個注意一個詞配套,也就是這些彈藥和武器是配套使用的,不能混著來,手槍不能用步槍子彈,步槍也不能用手槍子彈,大炮就更不用說了。而對于客戶端來說只需要工廠就行,不需要關(guān)系這些武器和這些彈藥如何搭配,把搭配組合的事兒讓工廠管了??蛻舳酥恍枰o抽象工廠引用替換具體的工廠實例,就能從工廠中獲取到相應(yīng)的武器和對應(yīng)的彈藥,而不會混亂。
區(qū)別
和工廠方法模式的區(qū)別在于,工廠方法模式只關(guān)心單一產(chǎn)品的生產(chǎn),而抽象工廠模式關(guān)心的是整體配套,工廠方法模式有些類似工廠中的生產(chǎn)線,只關(guān)心這條生產(chǎn)線是生產(chǎn)武器還是彈藥。
工廠模式并沒有簡單化代碼,而是封裝了邏輯,降低客戶端的使用成本和修改的成本,并沒有降低開發(fā)成本。
轉(zhuǎn)載于:https://www.cnblogs.com/waynelsh/p/8870735.html
總結(jié)
以上是生活随笔為你收集整理的创建型模式---工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USACO-Section2.3 Mon
- 下一篇: docker0: iptables: N