設(shè)計(jì)模式-工廠模式

1.概述

講工廠模式之前我們先來(lái)講一下我們項(xiàng)目中可能存在的一個(gè)問(wèn)題强经。大家的項(xiàng)目中使用的緩存,不管是官方提供的SharePreference還是File存儲(chǔ)誊辉、數(shù)據(jù)庫(kù)耿戚、還是基于這些封裝后的方案,在項(xiàng)目的使用中我們有時(shí)候沒(méi)有考慮到后期應(yīng)用版本升級(jí)迭代蟆炊,在需要緩存數(shù)據(jù)到本地的地方我們可能這樣寫(xiě)稽莉,以我目前使用的File緩存的開(kāi)源方案ACache為例子:

最基本的用法,沒(méi)有任何封裝涩搓,最原始的配方

ACache aCache = ACache.get(getActivity());
aCache.put(CacheKey.SHOW_FLAG, "1");
aCache.getAsString(CacheKey.SHOW_FLAG);

開(kāi)始用著還好污秆,但是時(shí)間長(zhǎng)了會(huì)遇到一個(gè)尷尬的情況:我們的產(chǎn)品越來(lái)越大,要求頁(yè)越來(lái)越高昧甘,存儲(chǔ)方案可能會(huì)細(xì)分出來(lái)良拼,比如我們想替換成SharePreference的方案,數(shù)據(jù)庫(kù)方案充边,像上面的那種寫(xiě)法庸推,你得全局搜索然后一遍遍的改,這也太煩了浇冰,一點(diǎn)也不優(yōu)雅贬媒。軟件工程里面有個(gè)說(shuō)法,如果遇到不能解決的問(wèn)題湖饱,加個(gè)中間層就好了掖蛤。

有沒(méi)有好的方式解決這個(gè)問(wèn)題呢?這就是工廠模式井厌。

多說(shuō)一句我對(duì)設(shè)計(jì)模式的理解:其實(shí)設(shè)計(jì)模式就是大家在編碼過(guò)程中積累的一種經(jīng)驗(yàn)蚓庭,說(shuō)到底是一個(gè)為了解決代碼問(wèn)題的模版。大家在相關(guān)的場(chǎng)景下照著這個(gè)模版做就能寫(xiě)出看起來(lái)還不錯(cuò)代碼來(lái)仅仆。

工廠模式分為三種器赞,從復(fù)雜的度、擴(kuò)展性上分為:簡(jiǎn)單工廠模式墓拜、工廠方法模式港柜、抽象工廠模式。

簡(jiǎn)單工廠模式

public class AppIOFactory implements Factory {
    public static final String PREFERENCES = "1";
    public static final String MEMERY = "2";
    public static final String DISK = "3";

    @Override
    public IOHandler createIOHandler(String type) {
        switch (type){
            case PREFERENCES:
                return new PreferenceHandler();
                break;
            case MEMERY:
                return new MemeryHandler();
                break;
            case DISK:
                return new DiskHandler();
                break;
            default:
                return new PreferenceHandler();
                break;
        }
    }
}

使用方法

AppIOFactory ioFactory = new AppIOFactory();
IOHandler ioHandler = ioFactory.createIOHandler(AppIOFactory.DISK);
ioHandler.put("name","王");
String name = ioHandler.get("name");

總結(jié)一下咳榜,我們這里不是在需要緩存的地方就new一個(gè)某種緩存模式的對(duì)象夏醉,而是通過(guò)AppIOFactory去統(tǒng)一的管理。

工廠方法模式

上面我們注意到AppIOFactory掌管了具體的緩存類的創(chuàng)建涌韩,實(shí)際使用中可能還有其它的功能畔柔,我們一般把這種類叫做“上帝類”,怎么樣可以減輕這個(gè)“上帝類”的負(fù)擔(dān)呢臣樱,這就是工廠方法模式靶擦。代碼我這里就不給出了腮考,其實(shí)就是為每種緩存方式創(chuàng)建一個(gè)IOFactory繼承Factory,這個(gè)IOFactory只負(fù)責(zé)某個(gè)緩存類的創(chuàng)建玄捕。其它的和簡(jiǎn)單工廠模式一樣踩蔚。

工廠方法模式的使用

DiskIOFactory diskIOFactory = new DiskIOFactory();
IOHandler ioHandler = diskIOFactory.createIOHandler();
ioHandler.save("name","wang");
DiskIOFactory diskIOFactory = new DiskIOFactory();
IOHandler ioHandler = diskIOFactory.createIOHandler();
String userName = ioHandler.getString("name");

好處顯而易見(jiàn),一個(gè)工廠負(fù)責(zé)一個(gè)對(duì)象的創(chuàng)建枚粘,類更輕量級(jí)了馅闽。但是問(wèn)題頁(yè)隨之而來(lái),工廠類變多了馍迄,這個(gè)時(shí)候我們的終極版本來(lái)了捞蛋,就是抽象工廠模式。

抽象工廠模式

要解決簡(jiǎn)單工廠模式和工廠方法模式造成的痛點(diǎn)柬姚,其實(shí)我們結(jié)合一下他們的思想

public interface Factory {
    void put(String key,String value);
    String get(String key);
}
public class DiskFactory implements Factory {

    @Override
    public void put(String key, String value) {

    }

    @Override
    public String get(String key) {
        return null;
    }
}
public interface IOFactory {
    Factory createMemoryFactory();
    Factory createDiskFactory();
    Factory createPreferenceFactory();
}
public class AppIOFactory implements IOFactory {

    @Override
    public Factory createMemoryFactory() {
        return new MemoryFactory();
    }

    @Override
    public Factory createDiskFactory() {
        return new DiskFactory();
    }

    @Override
    public Factory createPreferenceFactory() {
        return new PreferenceFactory();
    }
}

使用

Factory factory = new AppIOFactory();
factory.createDiskFactory().put("name","wang");
String name = factory.createDiskFactory().get("name");

總結(jié):其實(shí)三種工廠方法模式的區(qū)分并沒(méi)有那么嚴(yán)格拟杉,有時(shí)候你寫(xiě)著寫(xiě)著就會(huì)發(fā)現(xiàn)自己本來(lái)要寫(xiě)工廠方法模式然后寫(xiě)的是抽象工廠模式,平時(shí)在自己的項(xiàng)目中遇到比較復(fù)雜的地方想解耦的話量承,先想一想有沒(méi)有什么設(shè)計(jì)模式思想可以借鑒搬设,這樣就可以寫(xiě)出優(yōu)雅的代碼了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撕捍,一起剝皮案震驚了整個(gè)濱河市拿穴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忧风,老刑警劉巖默色,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異狮腿,居然都是意外死亡腿宰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)缘厢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吃度,“玉大人,你說(shuō)我怎么就攤上這事贴硫〈幻浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵英遭,是天一觀的道長(zhǎng)间护。 經(jīng)常有香客問(wèn)我,道長(zhǎng)挖诸,這世上最難降的妖魔是什么汁尺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮税灌,結(jié)果婚禮上均函,老公的妹妹穿的比我還像新娘。我一直安慰自己菱涤,他們只是感情好苞也,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著粘秆,像睡著了一般如迟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攻走,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天殷勘,我揣著相機(jī)與錄音,去河邊找鬼昔搂。 笑死玲销,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摘符。 我是一名探鬼主播贤斜,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逛裤!你這毒婦竟也來(lái)了瘩绒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤带族,失蹤者是張志新(化名)和其女友劉穎锁荔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蝙砌,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阳堕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了择克。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘱丢。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖祠饺,靈堂內(nèi)的尸體忽然破棺而出越驻,到底是詐尸還是另有隱情,我是刑警寧澤道偷,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布缀旁,位于F島的核電站,受9級(jí)特大地震影響勺鸦,放射性物質(zhì)發(fā)生泄漏并巍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一换途、第九天 我趴在偏房一處隱蔽的房頂上張望懊渡。 院中可真熱鬧刽射,春花似錦、人聲如沸剃执。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肾档。三九已至摹恰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怒见,已是汗流浹背俗慈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遣耍,地道東北人闺阱。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舵变,于是被迫代替她去往敵國(guó)和親馏颂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一棋傍、工廠模式簡(jiǎn)介 意圖定義一個(gè)創(chuàng)建對(duì)象的接口救拉,讓其子類自己決定實(shí)例化哪一個(gè)工廠類,工廠模式使其創(chuàng)建過(guò)程延遲到子類進(jìn)...
    怡紅快綠閱讀 603評(píng)論 0 0
  • 概述 先照搬書(shū)上工廠模式的定義瘫拣,即定義一個(gè)用于創(chuàng)建對(duì)象的接口亿絮,讓子類決定實(shí)例化哪一個(gè)類,工廠方法使一個(gè)類的實(shí)例化延...
    ymjkMaster閱讀 463評(píng)論 0 0
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,183評(píng)論 25 707
  • 背井離鄉(xiāng)的孩子麸拄,會(huì)有多少次在深夜里的痛哭派昧,才會(huì)在人前顯得若無(wú)其事。咬緊牙關(guān)的強(qiáng)撐拢切,會(huì)不會(huì)在未來(lái)的某一天開(kāi)出釋...
    傻沒(méi)錯(cuò)不白也不甜閱讀 322評(píng)論 0 0
  • 有人說(shuō)自卑是由童年時(shí)候的陰影導(dǎo)致的淮椰;也有人說(shuō)自卑是與生俱來(lái)五慈,父母遺傳下來(lái)的;更有人說(shuō)自卑是因?yàn)樽约旱貌坏街魉耄缓篁}動(dòng)...
    我還沒(méi)娶你怎敢嫁i閱讀 603評(píng)論 0 3