摘要:二簡單工廠模式組成工廠類工廠模式的核心,通過調(diào)用它來實現(xiàn)其他類的功能。三工廠方法模式利用工廠方法模式可以有效解決簡單工廠模式破壞開閉原則的問題。
一、概念
1、工廠模式分為三類:
(1)簡單工廠模式:一個工廠創(chuàng)建所有產(chǎn)品
(2)工廠方法模式:一個工廠方法創(chuàng)建一個產(chǎn)品
(3)抽象工廠模式:一個工廠方法創(chuàng)建一類產(chǎn)品
2、創(chuàng)建型模式
這種模式是指將實例的創(chuàng)建和使用分離開來,隱藏類實例的創(chuàng)建細(xì)節(jié),外界對于對象只需要知道它們共同的接口即可。
1、組成
(1)工廠類:工廠模式的核心,通過調(diào)用它來實現(xiàn)其他類的功能。
(2)抽象產(chǎn)品角色
(3)具體產(chǎn)品角色:繼承抽象工廠角色,工廠類就是創(chuàng)建此角色的實例。
2、舉例
想要說明這個模式,我們可以看一個簡單的例子
(1)首先創(chuàng)建一個Operation抽象類,作為抽象產(chǎn)品角色
public abstract class Operation { private int operator1; private int operator2; public int getOperator1() { return operator1; } public int getOperator2() { return operator2; } public void setOperator1(int operator1) { this.operator1 = operator1; } public void setOperator2(int operator2) { this.operator2 = operator2; } protected abstract int getResult(); }
(2)如果我們想要實現(xiàn)加減法運算,可以寫一個類繼承Operation類,并且重寫getResult方法。
public class OperationAdd extends Operation { @Override public int getResult(){ return getOperator1() + getOperator2(); } } public class OperationMinus extends Operation { @Override public int getResult(){ return getOperator1() - getOperator2(); } }
(3)如果我們要進行加減法運算,可以直接調(diào)用這兩個類創(chuàng)建出的實例的方法,但是簡單工廠模式希望我們能夠另外建立一個工廠,并且用這個工廠來創(chuàng)建加減法類的實例。因為這樣我們就不需要知道具體類的名字,只需要傳入加減法的符號即可。
public class Factory { public static Operation createOperation(String operator){ Operation op = null; switch (operator){ case "+": op = new OperationAdd(); break; case "-": op = new OperationMinus(); break; } return op; } }
(4)這樣我們的main函數(shù)就可以寫成這樣子。
public static void main(String []args){ Operation add = Factory.createOperation("+"); add.setOperator1(100); add.setOperator2(60); System.out.println(add.getResult()); }
3、存在的問題
我們可以考慮一下這種方式存在的問題,使用簡單工廠模式,可以不用知道具體類的名字,直接交給工廠來創(chuàng)建。
但是這樣一來,如果我們想要增加新的運算,即給工廠增加新的產(chǎn)品,首先寫新類,還要更改工廠類,增加新的switch判斷邏輯,也就不符合開閉原則(對修改關(guān)閉,對擴展開放)。
三、工廠方法模式
利用工廠方法模式可以有效解決簡單工廠模式破壞開閉原則的問題。
工廠方法模式在簡單工廠模式基礎(chǔ)上的主要變化在于,增加了一個抽象工廠接口,讓每個具體工廠類去實現(xiàn)抽象工廠接口,這樣用戶就不用關(guān)心具體工廠類創(chuàng)建的細(xì)節(jié)。
1、舉例
還是對于運算器這個例子,我們根據(jù)工廠模式進行修改。
(1)創(chuàng)建抽象工廠接口
public interface TemplateFactory { Operation CreateOperation(); }
(2)創(chuàng)建加法工廠,實現(xiàn)抽象工廠接口
public class AddFactory implements TemplateFactory{ public Operation CreateOperation(){ return new OperationAdd(); } } public class MinusFactory implements TemplateFactory{ public Operation CreateOperation(){ return new OperationMinus(); } }
(3)main函數(shù)
public static void main(String []args){ TemplateFactory factory = new AddFactory(); Operation add = factory.CreateOperation(); add.setOperator1(100); add.setOperator2(60); System.out.println(add.getResult()); }
使用工廠方法模式,能夠?qū)崿F(xiàn)高度解耦,需要增加新的產(chǎn)品時,只需要增加相關(guān)的類和工廠即可,不需要改動已有的產(chǎn)品和工廠。
2、存在的問題
使用工廠方法模式的主要問題在于,每次增加一個產(chǎn)品,都需要新增至少兩個類,這會增加系統(tǒng)的復(fù)雜性。
抽象工廠模式中提到一個產(chǎn)品族的概念,根據(jù)前面兩個工廠模式,簡單工廠是一個工廠“生產(chǎn)”所有產(chǎn)品,工廠方法是一個工廠生產(chǎn)一個產(chǎn)品。
而抽象工廠就是一個工廠生產(chǎn)一個產(chǎn)品族,產(chǎn)品族這個概念,是指位于不同產(chǎn)品等級結(jié)構(gòu)中,功能相關(guān)的產(chǎn)品組成的家族。
1、舉例
比如我們現(xiàn)在兩個產(chǎn)品族,HUAWEI手機族和XIAOMI手機族,兩個族中又分別包含商務(wù)機和時尚機這兩種不同產(chǎn)品等級的手機類型,那么我們需要建立兩個工廠:HUAWEI工廠和XIAOMI工廠,每個工廠里又分別提供生產(chǎn)商務(wù)機和時尚機。這里就不通過代碼來說明了。
工廠模式的主要目的,就是為了將實例對象的創(chuàng)建和使用分開,所以工廠干的事情,就是實例化對象。
而三種方式的聯(lián)系可以通過這張圖來幫助理解。
http://www.hollischuang.com/w...
參考:
http://www.hollischuang.com/w...
你以為工廠模式很簡單,可能是因為你懂的只是冰山的一角
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75320.html
摘要:在設(shè)計模式中,所有的設(shè)計模式都遵循這一原則。其實就是說在應(yīng)用程序中,所有的類如果使用或依賴于其他的類,則應(yīng)該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設(shè)計模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風(fēng)清揚-超全面的Java基礎(chǔ) 一、面向?qū)ο笏枷朐O(shè)計原則 1.單一職責(zé)原則 其實就是開發(fā)人員經(jīng)常說的高...
摘要:第二章創(chuàng)建和銷毀對象何時以及如何創(chuàng)建對象,何時以及如何避免創(chuàng)建對象,如何確保他們能夠適時地銷毀,以及如何管理對象銷毀之前必須進行的各種清理動作。表示工廠方法所返回的對象類型。 第二章 創(chuàng)建和銷毀對象 何時以及如何創(chuàng)建對象,何時以及如何避免創(chuàng)建對象,如何確保他們能夠適時地銷毀,以及如何管理對象銷毀之前必須進行的各種清理動作。 1 考慮用靜態(tài)工廠方法代替構(gòu)造器 一般在某處獲取一個類的實例最...
摘要:前言設(shè)計模式填坑系列,緊接前文距離上次寫筆記又過去了一個多月,我也不知道怎么加班加著加著就一個月了正文定義工廠模式是指提供一個創(chuàng)建對象的接口而不保留具體的創(chuàng)建邏輯,可以根據(jù)輸入類型創(chuàng)建對象。 前言 設(shè)計模式填坑系列,緊接前文(距離上次寫筆記又過去了一個多月,我也不知道怎么加班加著加著就一個月了-_-!) 正文 定義 工廠模式是指提供一個創(chuàng)建對象的接口而不保留具體的創(chuàng)建邏輯,可以根據(jù)輸入...
摘要:生成的包首次被訪問時,在全局包注冊表中自動地注冊。然而,類似于資源工廠注冊表,這種顯式注冊的過程僅當(dāng)獨立運行時被要求,在下運行時通過擴展指針來自動地完成。通過使用合適的資源工廠,就可以確定被產(chǎn)生的和被使用的持久化形式。 持久化(Persistence) EMF擁有一個強大的模型持久化框架。通過一個高度可定制資源實現(xiàn)(resource implementation)來支持XML序列化...
摘要:生成的包首次被訪問時,在全局包注冊表中自動地注冊。然而,類似于資源工廠注冊表,這種顯式注冊的過程僅當(dāng)獨立運行時被要求,在下運行時通過擴展指針來自動地完成。通過使用合適的資源工廠,就可以確定被產(chǎn)生的和被使用的持久化形式。 持久化(Persistence) EMF擁有一個強大的模型持久化框架。通過一個高度可定制資源實現(xiàn)(resource implementation)來支持XML序列化...
閱讀 2448·2021-10-08 10:17
閱讀 1824·2021-09-06 15:02
閱讀 2538·2019-08-29 17:30
閱讀 2663·2019-08-29 13:24
閱讀 1521·2019-08-29 11:12
閱讀 3337·2019-08-28 17:52
閱讀 666·2019-08-26 11:30
閱讀 3575·2019-08-26 11:01