設(shè)計模式第三篇-創(chuàng)建型模式【工廠模式】

設(shè)計模式案例分析-github

一去团、前言

工廠模式分為工廠方法(又稱簡單工廠)模式寞秃、抽象工廠模式。為方便講解踱葛,工廠方法或者簡單工廠統(tǒng)一命名為工廠方法模式丹莲。本篇先講解工廠方法模式

二、工廠方法模式之簡單版——簡單工廠

定義:?靜態(tài)實例化符合我們要求的實例

特點:? 對于簡單的工廠方法尸诽,可以理解為就是一個創(chuàng)建對象的工具類(工廠方法的簡化版)

案例1: android中的BitmapFactory, 創(chuàng)建bitmap的過程甥材,客戶端不需要知道,創(chuàng)建的過程由BitmapFactory處理性含,掩藏了創(chuàng)建bitmap的細(xì)節(jié)洲赵。

? ? ? ? ? android中的XmlPullParserFactory,創(chuàng)建解析器

案例2:比如創(chuàng)建地圖商蕴,定義了創(chuàng)建地圖的統(tǒng)一規(guī)范板鬓,具體實現(xiàn)你可以創(chuàng)建高德地圖、蘋果地圖等究恤,使用簡單工廠模式俭令,客戶端只要傳入要創(chuàng)建什么類型的地圖,工廠就幫你創(chuàng)建好部宿,掩藏了內(nèi)部創(chuàng)建對象的細(xì)節(jié)

類圖結(jié)構(gòu):

代碼案例見:設(shè)計模式案例分析-github

總結(jié):靜態(tài)實例化符合我們要求的實例(本質(zhì)核心:降低客戶端與要創(chuàng)建對象的耦合)

分析:?考慮有如下需求: 百度地圖有全景圖抄腔,高德地圖沒有的功能,要怎么設(shè)計???

由于簡單工廠模式理张,有點太過簡單這時候使用簡單工廠就不是很好用了赫蛇,因為MapViewFactory是統(tǒng)一的工廠入口,返回創(chuàng)建的是抽象對象雾叭,如果需要在繼續(xù)的簡單工廠改的話悟耘,就需要在MapViewFactory中修改代碼,而高德又沒有织狐,案例就不應(yīng)該寫在公用的MapViewFactory中暂幼。

因此引入了工廠方法模式,即需要對工廠進(jìn)行抽象(使用接口)移迫,修改后只要把新增的需求寫在具體的工廠中即可,彌補了簡單工廠方法對修改開放的弱點旺嬉。

三、 工廠方法模式之規(guī)范版——工廠方法

特點: 1厨埋、針對單個產(chǎn)品抽象

? ? ? ? ?2邪媳、工廠的抽象方法中只有一條流水線

定義: 定義一個用戶創(chuàng)建對象的統(tǒng)計接口,具體實現(xiàn)由子類實現(xiàn)

分析:?考慮有如下需求: 百度地圖有全景圖,高德地圖沒有的功能雨效,要怎么設(shè)計???

由于簡單工廠模式迅涮,有點太過簡單這時候使用簡單工廠就不是很好用了,因為MapViewFactory是統(tǒng)一的工廠入口徽龟,返回創(chuàng)建的是抽象對象叮姑,如果需要在繼續(xù)的簡單工廠改的話,就需要在MapViewFactory中修改代碼顿肺,而高德又沒有戏溺,案例就不應(yīng)該寫在公用的MapViewFactory中渣蜗。

因此引入了工廠方法模式屠尊,即需要對工廠進(jìn)行抽象(使用接口),修改后只要把新增的需求寫在具體的工廠中即可,?彌補了簡單工廠方法對修改開放的弱點耕拷。

核心: 掩藏創(chuàng)建對象的細(xì)節(jié)讼昆,封裝了統(tǒng)一創(chuàng)建的對象,后續(xù)要修改擴(kuò)展就容易了

案例:? 比如創(chuàng)建地圖骚烧,定義了創(chuàng)建地圖的統(tǒng)一規(guī)范浸赫,具體實現(xiàn)你可以創(chuàng)建高德地圖、蘋果地圖等赃绊。

類圖結(jié)構(gòu):?

分析: 角色既峡?

1、抽象工廠IMapFactory——定義了創(chuàng)建對象的規(guī)范碧查,具體創(chuàng)建什么對象由子類實現(xiàn)

2运敢、具體工廠BaiduMapFactory——定義具體創(chuàng)建對象的流程(可沈略,通過抽象工程類外部傳入要創(chuàng)建對象的類型忠售,返回具體的對象传惠,當(dāng)然不建議這樣做,因為這樣客戶端還是依賴了具體的類型(因為傳參了稻扬,具體可下載github上的demo查閱)

3卦方、抽象產(chǎn)品IMapView——定義工廠所要創(chuàng)建產(chǎn)品共有的性質(zhì)

4、具體產(chǎn)品BaiduMapView——定義工廠所要創(chuàng)建的具體產(chǎn)品

可以看到泰佳,上圖上半部分是工廠抽象和實現(xiàn)體系盼砍,下半部分是產(chǎn)品抽象和實現(xiàn)體系,其中工廠體系依賴于產(chǎn)品體系逝她,每一個工廠負(fù)責(zé)創(chuàng)造一種產(chǎn)品衬廷,這就省去了簡單工廠中的elseif判斷,由客戶端決定實例化一個特定的工廠去創(chuàng)建相應(yīng)的產(chǎn)品汽绢。

好處:這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品吗跋,即這時候如果新增了一個xx的地圖,只需要新建一個xx地圖,以及xx地圖的工廠即可實現(xiàn)跌宛,而不需要在原來代碼上進(jìn)行修改酗宋,做到了對擴(kuò)展開放,對修改關(guān)閉的原則疆拘。

案例: android或者java中有哪些場景使用了工廠方法?

? ? ? ? 1蜕猫、java中的jdbc設(shè)計(java數(shù)據(jù)庫連接)


2、android/java中的集合

分析:??工廠方法模式就是提供一個抽象的工廠哎迄,一個抽象的產(chǎn)品回右,在上述當(dāng)中相當(dāng)于Driver(數(shù)據(jù)庫連接工廠)和Connection(抽象產(chǎn)品),實現(xiàn)的一方需要提供一個具體的工廠類(比如mysql驅(qū)動)和一個具體的產(chǎn)品(比如mysql數(shù)據(jù)庫連接).

? ? ? ? ? Iterable相當(dāng)于抽象工廠定義漱挚,Iterator相當(dāng)于抽象產(chǎn)品翔烁,ArrayList、HashSet等是具體的工廠旨涝,產(chǎn)生的迭代器是具體的產(chǎn)品蹬屹。

疑惑:??各位可能會說,不對啊白华,這和我們剛才理解的不太一樣啊慨默,按照剛才的說法,我們不是應(yīng)該直接使用iterable和iterator嗎弧腥?這樣多牛X厦取,我們不依賴于具體產(chǎn)品了」芴拢可是sun或者說oracle為了集合框架給你提供了這么多具備各個特性的集合虾攻,你只用iterator和iterable,估計當(dāng)初參與設(shè)計集合框架的人都要氣的去shi了抛蚤。台谢。

? ? ? ? 上述這便是工廠方法模式另外一種用法了,剛才因為我們不關(guān)心真正的產(chǎn)品是什么岁经,所以我們直接使用抽象接口操作朋沮。但是我們使用iterable和iterator的時候,我們是關(guān)心真正產(chǎn)品的特性的缀壤,所以為了使用產(chǎn)品的特性樊拓,我們就需要使用產(chǎn)品特有的接口了,比如特殊的SortedSet可排序塘慕,比如ArrayList可以有重復(fù)元素筋夏,可以根據(jù)索引獲取元素等等。當(dāng)然你依然是可以使用iterable和iterator的图呢,但是不管你用什么条篷,在這種場景下骗随,產(chǎn)品是你自己選的。


總結(jié): 什么場景使用工廠方法模式?

? ? 1赴叹、在工廠的抽象中鸿染,只針對一條流水線,一個產(chǎn)品乞巧,比如只創(chuàng)建地圖,? 即我們需要一個產(chǎn)品幫我們完成一項任務(wù)涨椒,但是這個產(chǎn)品有可能有很多品牌(像這里的mysql,oracle)绽媒,為了保持我們對產(chǎn)品操作的一致性蚕冬,我們就可能要用到工廠方法模式,

比如我們需要直播sdk來幫我們完成直播是辕,但是直播可能有很多種“產(chǎn)商", 比如騰訊云直播囤热、阿里直播等,就可以考慮使用工廠方法模式免糕,抽象直播這一層赢乓,具體的創(chuàng)建由具體的工廠來實現(xiàn)忧侧。

缺點: 需要大量的具體工廠和具體產(chǎn)品石窑,當(dāng)然也可以使用泛型來規(guī)避具體的工廠(這種個人感覺不建議使用,因為客戶端對具體的產(chǎn)品依賴蚓炬,傳入了參數(shù))


四松逊、工廠模式——抽象工廠

定義:? 為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個接口,而且無需指定他們的具體類肯夏。

通俗理解: 有多條流水線

類圖結(jié)構(gòu):?



下面給出本文所有代碼的github鏈接:

github工廠模式源碼鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末经宏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子驯击,更是在濱河造成了極大的恐慌烁兰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徊都,死亡現(xiàn)場離奇詭異沪斟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)暇矫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門主之,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人李根,你說我怎么就攤上這事槽奕。” “怎么了房轿?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵粤攒,是天一觀的道長所森。 經(jīng)常有香客問我,道長夯接,這世上最難降的妖魔是什么必峰? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮钻蹬,結(jié)果婚禮上吼蚁,老公的妹妹穿的比我還像新娘。我一直安慰自己问欠,他們只是感情好肝匆,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顺献,像睡著了一般旗国。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上注整,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天能曾,我揣著相機(jī)與錄音,去河邊找鬼肿轨。 笑死寿冕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椒袍。 我是一名探鬼主播驼唱,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驹暑!你這毒婦竟也來了玫恳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤优俘,失蹤者是張志新(化名)和其女友劉穎京办,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帆焕,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡惭婿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了视搏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片审孽。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浑娜,靈堂內(nèi)的尸體忽然破棺而出佑力,到底是詐尸還是另有隱情,我是刑警寧澤筋遭,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布打颤,位于F島的核電站暴拄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏编饺。R本人自食惡果不足惜乖篷,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望透且。 院中可真熱鬧撕蔼,春花似錦、人聲如沸秽誊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锅论。三九已至讼溺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間最易,已是汗流浹背怒坯。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留藻懒,地道東北人剔猿。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像束析,于是被迫代替她去往敵國和親艳馒。 傳聞我的和親對象是個殘疾皇子憎亚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

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

  • 設(shè)計模式匯總 一员寇、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,937評論 1 15
  • 1 場景問題# 1.1 導(dǎo)出數(shù)據(jù)的應(yīng)用框架## 考慮這樣一個實際應(yīng)用:實現(xiàn)一個導(dǎo)出數(shù)據(jù)的應(yīng)用框架第美,來讓客戶選擇數(shù)據(jù)...
    七寸知架構(gòu)閱讀 6,644評論 6 74
  • 設(shè)計模式基本原則 開放-封閉原則(OCP)蝶锋,是說軟件實體(類、模塊什往、函數(shù)等等)應(yīng)該可以拓展扳缕,但是不可修改。開-閉原...
    西山薄涼閱讀 3,792評論 3 14
  • 1 場景問題# 大家都知道别威,在Java應(yīng)用開發(fā)中躯舔,要“面向接口編程”。那么什么是接口省古?接口有什么作用粥庄?接口如何使用...
    七寸知架構(gòu)閱讀 6,415評論 14 70
  • 20170929高麗新心賞第46天 親愛的兒子,今天還是媽媽來接你和弟弟豺妓,回家的路上討論著剛剛在青龍橋發(fā)生的事情惜互,...
    rygao閱讀 131評論 0 0