簡(jiǎn)易理解設(shè)計(jì)模式之:工廠方法模式——數(shù)據(jù)存儲(chǔ)例子

介紹:

工廠方法模式屬于創(chuàng)建型模式塑娇。定義一個(gè)用戶創(chuàng)建對(duì)象的接口翁涤,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類延旧。

類圖:

工廠方法模式UML類圖.png

Product(抽象產(chǎn)品類):需要?jiǎng)?chuàng)建的產(chǎn)品的抽象類卓箫。
ConcreteProduct(具體產(chǎn)品類):為實(shí)現(xiàn)抽象產(chǎn)品的某個(gè)具體產(chǎn)品類。
Factory(抽象工廠類):工廠模式方法核心垄潮,返回一個(gè)Product類型的對(duì)象烹卒。
ConcreteFactory(具體工廠類):實(shí)現(xiàn)具體業(yè)務(wù)邏輯闷盔,返回ConcreteProduct實(shí)例。

用法:

? 在任何需要生成復(fù)雜對(duì)象的地方旅急,都可以使用工廠方法模式逢勾。
? 如果一個(gè)對(duì)象擁有很多子類,創(chuàng)建該對(duì)象的子類時(shí)可以使用工廠方法模式藐吮。

個(gè)人理解:如果創(chuàng)建某個(gè)對(duì)象時(shí)需要進(jìn)行許多額外的操作(不能直接new的時(shí)候)溺拱,又或者存在一個(gè)類有很多子類,用工廠方法創(chuàng)建那些類不但可以面向接口的編程谣辞,也便于維護(hù)與管理各種子類迫摔。

例子:

工廠方法模式比較簡(jiǎn)單,我們知道在項(xiàng)目中數(shù)據(jù)持久化的方式有很多種泥从,例如SQLite數(shù)據(jù)庫(kù)存儲(chǔ)句占、XML文件存儲(chǔ)、普通文件存儲(chǔ)等躯嫉。每種方式就是常規(guī)的增刪改查操作纱烘,我們一起試一下吧:

需求:用三種方式實(shí)現(xiàn)數(shù)據(jù)化持久存儲(chǔ)

1、運(yùn)用工廠方法模式
工廠方法模式例子UML類圖.png

先看一波類圖祈餐,結(jié)構(gòu)復(fù)雜嗎擂啥?非常復(fù)雜,但這就是工廠模式的結(jié)構(gòu)帆阳,是沒(méi)問(wèn)題的哺壶。我們不急先試一下怎么運(yùn)用這個(gè)模式。

1.1蜒谤、創(chuàng)建一個(gè)產(chǎn)品抽象類

public abstract class IOHandler {
    public abstract void add(String key,String value);
    public abstract void remove(String key);
    public abstract void update(String key,String value);
    public abstract void query(String key);
}

對(duì)數(shù)據(jù)的操作方法無(wú)論用到那種方式变骡,都離不開(kāi)增刪改查的方法,因此我們將以上4個(gè)方法抽象出抽象產(chǎn)品類芭逝。

1.2塌碌、創(chuàng)建具體產(chǎn)品類,實(shí)現(xiàn)業(yè)務(wù)邏輯

public class FileHandler extends IOHandler {

    @Override
    public void add(String key, String value) {
        System.out.println("FileHanlder:添加一條記錄");
    }

    @Override
    public void remove(String key) {
        System.out.println("FileHanlder:刪除一條記錄");
    }

    @Override
    public void update(String key, String value) {
        System.out.println("FileHanlder:更新一條記錄");
    }

    @Override
    public void query(String key) {
        System.out.println("FileHanlder:查詢一條記錄");
    }
}
public class DBHandler extends IOHandler {
    @Override
    public void add(String key, String value) {
        System.out.println("DBHandler:添加一條記錄");
    }

    @Override
    public void remove(String key) {
        System.out.println("DBHandler:刪除一條記錄");
    }

    @Override
    public void update(String key, String value) {
        System.out.println("DBHandler:更新一條記錄");
    }

    @Override
    public void query(String key) {
        System.out.println("DBHandler:查詢一條記錄");
    }
}
public class XMLHandler extends IOHandler {
    @Override
    public void add(String key, String value) {
        System.out.println("XMLHandler:添加一條記錄");
    }

    @Override
    public void remove(String key) {
        System.out.println("XMLHandler:刪除一條記錄");
    }

    @Override
    public void update(String key, String value) {
        System.out.println("XMLHandler:更新一條記錄");
    }

    @Override
    public void query(String key) {
        System.out.println("XMLHandler:查詢一條記錄");
    }
}

每種存儲(chǔ)方式實(shí)現(xiàn)旬盯。例如DBHandler實(shí)現(xiàn)上肯定是運(yùn)用到數(shù)據(jù)庫(kù)的一些方法台妆,F(xiàn)ileHandler肯定也用到文件存儲(chǔ)的方法。具體存儲(chǔ)操作的內(nèi)容就不多說(shuō)了大家可以參考其他資料胖翰,這里用控制臺(tái)輸出表示接剩。

1.3、創(chuàng)建抽象工廠類

public abstract class IOFactory {
    public abstract IOHandler getHandler();
}

很簡(jiǎn)單萨咳,定義獲得公共方法的接口懊缺,表示子類將會(huì)創(chuàng)建一個(gè)IOHandler的對(duì)象。

1.4、創(chuàng)建具體工廠類

public class FileFactory extends IOFactory {
    @Override
    public IOHandler getHandler() {
        return new FileHandler();
    }
}
public class DBFactory extends IOFactory {
    @Override
    public IOHandler getHandler() {
        return new DBHandler();
    }
}
public class XMLFactory extends IOFactory {
    @Override
    public IOHandler getHandler() {
        return new XMLHandler();
    }
}

各個(gè)工廠分別生成各自的產(chǎn)品鹃两。

1.5遗座、使用及輸出結(jié)果

public class Client {
    public static void main(String[] args) {
        IOFactory factory = new XMLFactory();
        IOHandler handler = factory.getHandler();
        handler.add("name","小明");
        handler.update("name","小紅");
        handler.query("name");
        handler.remove("name");
    }
}
XMLHandler:添加一條記錄
XMLHandler:更新一條記錄
XMLHandler:查詢一條記錄
XMLHandler:刪除一條記錄

總結(jié)一下,我們已經(jīng)完成了工廠方法模式的使用了俊扳,如果新增存儲(chǔ)方式的話就新增工廠類新增具體產(chǎn)品類途蒋。生成復(fù)雜對(duì)象時(shí),無(wú)需知道具體類名馋记,只需知道相應(yīng)的工廠方法即可号坡。但其實(shí)過(guò)多的類必然會(huì)導(dǎo)致結(jié)構(gòu)復(fù)雜化,這也是難以避免的梯醒。所以某些簡(jiǎn)單的情況下可以權(quán)衡是否使用工廠模式了宽堆。

2、工廠方法模式VS簡(jiǎn)單工廠模式

簡(jiǎn)單工廠模式中茸习,確定只有一個(gè)工廠的情況去實(shí)現(xiàn)業(yè)務(wù)邏輯畜隶,被視為是工廠方法模式的一種弱化版本。

2.1逮光、用簡(jiǎn)單工廠模式實(shí)現(xiàn)上述業(yè)務(wù)

public class IOEasyFactory {
    public static IOHandler getHandler(Class<? extends IOHandler> clz) {
        IOHandler handler = null;
        try {
            handler = (IOHandler) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return handler;
    }
}

用了Java反射的方式去實(shí)現(xiàn),否則的話就傳入類型然后用if-else判斷的方式去實(shí)現(xiàn)墩划。

2.2涕刚、使用及輸出結(jié)果

public class Client {
    public static void main(String[] args) {
        IOHandler handler = IOEasyFactory.getHandler(DBHandler.class);
        handler.add("name","小明");
        handler.update("name","小紅");
        handler.query("name");
        handler.remove("name");
    }
}
DBHandler:添加一條記錄
DBHandler:更新一條記錄
DBHandler:查詢一條記錄
DBHandler:刪除一條記錄

2.3、總結(jié)對(duì)比
簡(jiǎn)單工廠模式的最大優(yōu)點(diǎn)在于工廠類中包含了必要的邏輯判斷乙帮,根據(jù)客戶端的選擇條件動(dòng)態(tài)實(shí)例化相關(guān)的類杜漠。簡(jiǎn)單工廠模式只需要知道工廠類中代表具體產(chǎn)品的參數(shù)即可。

工廠方法模式實(shí)現(xiàn)時(shí)察净,客戶端需要決定實(shí)例化哪一個(gè)工廠來(lái)實(shí)現(xiàn)相關(guān)的類驾茴,選擇判斷的問(wèn)題還是存在的,工廠方法把簡(jiǎn)單工廠的內(nèi)部判斷邏輯轉(zhuǎn)移到了客戶端中進(jìn)行氢卡。工廠方法模式只需要知道具體工廠類即可锈至。

感謝您的閱讀~

轉(zhuǎn)載請(qǐng)注明出處喔:http://www.reibang.com/p/f3c1057b989b

推薦閱讀

基礎(chǔ)篇:
設(shè)計(jì)模式前篇之——UML類圖必會(huì)知識(shí)點(diǎn)
設(shè)計(jì)模式前篇之——一起過(guò)一下面向?qū)ο蟮母拍?/a>
創(chuàng)建型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:簡(jiǎn)單工廠模式——來(lái)試試接入支付功能
簡(jiǎn)易理解設(shè)計(jì)模式之:工廠方法模式——數(shù)據(jù)存儲(chǔ)例子
簡(jiǎn)易理解設(shè)計(jì)模式之:抽象工廠模式——更換數(shù)據(jù)庫(kù)例子
簡(jiǎn)易理解設(shè)計(jì)模式之:建造者模式——學(xué)習(xí)使用“鏈?zhǔn)秸{(diào)用”
簡(jiǎn)易理解設(shè)計(jì)模式之:原型模式——深、淺拷貝的概念
簡(jiǎn)易理解設(shè)計(jì)模式之:?jiǎn)卫J健獑卫J降膸追N常用寫法
結(jié)構(gòu)型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:適配器模式——Android列表視圖控件設(shè)計(jì)方式
簡(jiǎn)易理解設(shè)計(jì)模式之:橋接模式——穿衣服經(jīng)典案例2
簡(jiǎn)易理解設(shè)計(jì)模式之:組合模式——實(shí)現(xiàn)View中的樹(shù)狀結(jié)構(gòu)
簡(jiǎn)易理解設(shè)計(jì)模式之:裝飾模式——穿衣服經(jīng)典案例
簡(jiǎn)易理解設(shè)計(jì)模式之:外觀模式——第三方SDK的幫助類
簡(jiǎn)易理解設(shè)計(jì)模式之:享元模式——五子棋游戲例子
簡(jiǎn)易理解設(shè)計(jì)模式之:代理模式——iOS視圖控件設(shè)計(jì)方式
行為型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:策略模式——優(yōu)化一下支付功能
簡(jiǎn)易理解設(shè)計(jì)模式之:模板方法模式——Android中的BaseActivity基類
簡(jiǎn)易理解設(shè)計(jì)模式之:觀察者模式——監(jiān)聽(tīng)與回調(diào)
簡(jiǎn)易理解設(shè)計(jì)模式之:狀態(tài)模式——優(yōu)化登錄操作
簡(jiǎn)易理解設(shè)計(jì)模式之:備忘錄模式——Word文檔的工作原理
簡(jiǎn)易理解設(shè)計(jì)模式之:迭代器模式——遍歷對(duì)象的好幫手
簡(jiǎn)易理解設(shè)計(jì)模式之:命令模式——實(shí)現(xiàn)命令的參數(shù)化配置
簡(jiǎn)易理解設(shè)計(jì)模式之:責(zé)任鏈模式——OA中請(qǐng)假流程示例
簡(jiǎn)易理解設(shè)計(jì)模式之:中介者模式——多人聊天室例子
簡(jiǎn)易理解設(shè)計(jì)模式之:解釋器模式——語(yǔ)言和文法
簡(jiǎn)易理解設(shè)計(jì)模式之:訪問(wèn)者模式——員工考核例子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末译秦,一起剝皮案震驚了整個(gè)濱河市峡捡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筑悴,老刑警劉巖们拙,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異阁吝,居然都是意外死亡砚婆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門突勇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)装盯,“玉大人坷虑,你說(shuō)我怎么就攤上這事⊙楹唬” “怎么了猖吴?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挥转。 經(jīng)常有香客問(wèn)我海蔽,道長(zhǎng),這世上最難降的妖魔是什么绑谣? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任党窜,我火速辦了婚禮,結(jié)果婚禮上借宵,老公的妹妹穿的比我還像新娘幌衣。我一直安慰自己,他們只是感情好壤玫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布豁护。 她就那樣靜靜地躺著,像睡著了一般欲间。 火紅的嫁衣襯著肌膚如雪楚里。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天猎贴,我揣著相機(jī)與錄音班缎,去河邊找鬼。 笑死她渴,一個(gè)胖子當(dāng)著我的面吹牛达址,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趁耗,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沉唠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了苛败?” 一聲冷哼從身側(cè)響起右冻,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎著拭,沒(méi)想到半個(gè)月后纱扭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡儡遮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年乳蛾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肃叶,死狀恐怖蹂随,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情因惭,我是刑警寧澤岳锁,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蹦魔,受9級(jí)特大地震影響激率,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勿决,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一等限、第九天 我趴在偏房一處隱蔽的房頂上張望搏屑。 院中可真熱鬧均牢,春花似錦涩禀、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至玩般,卻和暖如春银觅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壤短。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工设拟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慨仿,地道東北人久脯。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像镰吆,于是被迫代替她去往敵國(guó)和親帘撰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345