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