設(shè)計(jì)模式 ① — 創(chuàng)建型模式

創(chuàng)建型模式:負(fù)責(zé)對(duì)象的創(chuàng)建。

工廠(chǎng)方法模式(Factory Method)摊腋;解決某個(gè)對(duì)象的創(chuàng)建工作。

抽象工廠(chǎng)模式(Abstract Factory): 解決一系列相互依賴(lài)對(duì)象的創(chuàng)建工作。

創(chuàng)建者模式(Builder):解決“一些復(fù)雜對(duì)象”的創(chuàng)建工作昏鹃。

原型模式(Prototype):解決某些結(jié)構(gòu)復(fù)雜的對(duì)象的創(chuàng)建工作。

單例模式(Singleton):解決了實(shí)體對(duì)象的個(gè)數(shù)問(wèn)題诀诊。

單例模式(SINGLETON)

基礎(chǔ)概念:

介紹:

單例對(duì)象的類(lèi)保證只有一個(gè)實(shí)例存在洞渤。

定義:

確保某個(gè)類(lèi)只有一個(gè)實(shí)例,向整個(gè)系統(tǒng)提供這個(gè)實(shí)例属瓣。

使用場(chǎng)景:

確保某個(gè)類(lèi)只有一個(gè)對(duì)象場(chǎng)景载迄,避免產(chǎn)生多個(gè)對(duì)象消耗過(guò)多的資源,或者某種類(lèi)型的對(duì)象因該有且只有一個(gè)抡蛙。

UML圖:



Client?:?高層客戶(hù)端护昧。

Singleton?:?單例類(lèi)。


Android源碼里的實(shí)現(xiàn):

常見(jiàn)的寫(xiě)法(線(xiàn)程不安全):


推薦的寫(xiě)法(線(xiàn)程安全粗截;延遲加載惋耙;效率較高):


雙重檢查:


靜態(tài)內(nèi)部類(lèi):


枚舉的寫(xiě)法:

Android不推薦枚舉,耗費(fèi)資源:

https://www.youtube.com/watch?t=32&v=Hzs6OBcvNQE

在Android項(xiàng)目里常用于生成View的LayoutInflater,就是單例的一種實(shí)現(xiàn)绽榛。

工廠(chǎng)方法模式(FACTORY)

介紹:

工廠(chǎng)方法模式是創(chuàng)建型設(shè)計(jì)模式之一?湿酸。

定義:

工廠(chǎng)方法模式定義一個(gè)創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi)?灭美。


使用場(chǎng)景:

需要生成復(fù)雜對(duì)象的地方適合使用工廠(chǎng)模式推溃,用new就可以完成創(chuàng)建的對(duì)象無(wú)需使用工廠(chǎng)模式。?


UML圖:


Android源碼里的實(shí)現(xiàn):

Activity的onCreate就可以看作是一個(gè)工廠(chǎng)方法?届腐。?

優(yōu)點(diǎn):

減少內(nèi)存開(kāi)銷(xiāo)铁坎,提高性能。

缺點(diǎn):

每次添加新的產(chǎn)品就要編寫(xiě)一個(gè)新的產(chǎn)品類(lèi)犁苏,導(dǎo)致類(lèi)結(jié)構(gòu)的復(fù)雜化硬萍。

抽象工廠(chǎng)方法(ABSTRACT?FACTORY)

介紹:

抽象工廠(chǎng)模式起源于以前對(duì)不同操作系統(tǒng)的圖形化解決方案,不同操作系統(tǒng)中的按鈕和文本控件實(shí)現(xiàn)不同傀顾,展示效果也不一樣襟铭。?

定義:

為創(chuàng)建一組相關(guān)或者是相互依賴(lài)的對(duì)象提供一個(gè)接口,而不需要指定它們的具體類(lèi)短曾。?

使用場(chǎng)景:

一個(gè)家族有相同的約束時(shí)可以使用抽象工廠(chǎng)模式寒砖。?

UML圖:


AbstractFactory?:?抽象工廠(chǎng)角色,聲明了一組用于創(chuàng)建一個(gè)產(chǎn)品的方法嫉拐,每個(gè)方法對(duì)應(yīng)一種產(chǎn)品哩都。

ConcreteFactory?:?具體工廠(chǎng)角色,實(shí)現(xiàn)了在抽象工廠(chǎng)中定義的創(chuàng)建產(chǎn)品的方法婉徘,生成一組具體產(chǎn)品漠嵌,產(chǎn)品構(gòu)成一個(gè)產(chǎn)品種類(lèi)。

AbstractProduct?:?抽象產(chǎn)品角色盖呼,為每種產(chǎn)品聲明接口儒鹿,比如圖中AbstractProductA和B

ConcreteProduct?:?具體產(chǎn)品角色,定義具體工廠(chǎng)生產(chǎn)的具體產(chǎn)品對(duì)象几晤,如圖中ConcreteProductA1,A2,B1和B2约炎。


Android源碼里的實(shí)現(xiàn):

Android里對(duì)MediaPlayer的創(chuàng)建。

優(yōu)點(diǎn):

分離接口和實(shí)現(xiàn)蟹瘾。

缺點(diǎn):

1.?類(lèi)文件爆炸性增加

2.?不容易擴(kuò)展新的產(chǎn)品類(lèi)圾浅,因?yàn)槊吭黾右粋€(gè)產(chǎn)品類(lèi)就需要修改抽象工廠(chǎng)。

工廠(chǎng)方法和抽象工廠(chǎng)的區(qū)別:

區(qū)別:工廠(chǎng)方法模式只有一個(gè)抽象產(chǎn)品類(lèi)憾朴,而抽象工廠(chǎng)模式有多個(gè)狸捕。  ??工廠(chǎng)方法模式的具體工廠(chǎng)類(lèi)只能創(chuàng)建一個(gè)具體產(chǎn)品類(lèi)的實(shí)例众雷,而抽象工廠(chǎng)模式可以創(chuàng)建多個(gè)灸拍。

原型模式(PROTOTYPE)

介紹:

原型二字表明了該模式有一個(gè)樣板實(shí)例做祝,用戶(hù)從這個(gè)樣本實(shí)例中復(fù)制一個(gè)內(nèi)部屬性一致的對(duì)象,原型模式多用于創(chuàng)建復(fù)雜的或構(gòu)造耗時(shí)的實(shí)例株搔。?

定義:

原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi)剖淀,并通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。?

使用場(chǎng)景:

1.類(lèi)初始化需要消耗非常多的資源纤房,包括數(shù)據(jù),硬件資源等翻诉,通過(guò)原型拷貝避免消耗炮姨。

2.一個(gè)對(duì)象需要提供給其他對(duì)象訪(fǎng)問(wèn),各個(gè)調(diào)用者需要修改其值時(shí)碰煌,考慮原型模式拷貝或者多個(gè)對(duì)象供調(diào)用者使用舒岸,即保護(hù)性拷貝。?


UML圖:


Client?:?客戶(hù)端用戶(hù)芦圾。

Prototype?:?抽象類(lèi)或者接口蛾派,聲明具備clone能力。

ConcretePrototype?:?具體原型類(lèi)个少。


Android源碼里的實(shí)現(xiàn):

Intent的clone()方法洪乍。


優(yōu)點(diǎn):

原型模式是在內(nèi)存中二進(jìn)制流的拷貝,比直接new一個(gè)對(duì)象性能好很多夜焦,當(dāng)要在一個(gè)循環(huán)體內(nèi)產(chǎn)生大量的對(duì)象時(shí)壳澳,原型模式可以更好體現(xiàn)其優(yōu)點(diǎn)。

缺點(diǎn):

直接在內(nèi)存中拷貝時(shí)茫经,構(gòu)造器是不會(huì)執(zhí)行的巷波,優(yōu)點(diǎn)是減少了約束,缺點(diǎn)也是減少了約束卸伞。

建造者模式(BUILD)

介紹:

Builder模式是一步一步創(chuàng)建一個(gè)復(fù)雜對(duì)象的創(chuàng)建型模式抹镊,它允許用戶(hù)在不知道內(nèi)部構(gòu)建細(xì)節(jié)的情況下,更精細(xì)的控制對(duì)象構(gòu)造流程荤傲。?

定義:

將一個(gè)復(fù)雜對(duì)象的構(gòu)建和它的表示分離垮耳,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。?

使用場(chǎng)景:

1.?初始化一個(gè)對(duì)象特別復(fù)雜弃酌,參數(shù)多氨菇,很多參數(shù)都有默認(rèn)值時(shí)。比如ImageLoader里的ImageLoaderConfig妓湘。

2.?類(lèi)非常復(fù)雜查蓉,產(chǎn)品類(lèi)中的調(diào)用順序不同產(chǎn)生了不同的作用,這個(gè)時(shí)候使用建造者模式非常適合榜贴。?


UML圖:


Product?:?產(chǎn)品的抽象類(lèi)豌研。

Builder?:?抽象Builder類(lèi)妹田,規(guī)范產(chǎn)品的組建,一般是子類(lèi)實(shí)現(xiàn)具體的組建過(guò)程鹃共。

ConcreteBuilder?:?具體的Builder類(lèi)鬼佣。

Director?:?統(tǒng)一組裝過(guò)程。

Android源碼里的實(shí)現(xiàn):

WindowManager


優(yōu)點(diǎn):?

1.?良好的封裝性霜浴,使用建造者模式可以使客戶(hù)端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)晶衷。

2.?建造者獨(dú)立,容易擴(kuò)展阴孟。

缺點(diǎn):?

會(huì)產(chǎn)生多余的Builder對(duì)象和Director對(duì)象晌纫,消耗內(nèi)存。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末永丝,一起剝皮案震驚了整個(gè)濱河市锹漱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慕嚷,老刑警劉巖哥牍,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喝检,居然都是意外死亡嗅辣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)蛇耀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辩诞,“玉大人,你說(shuō)我怎么就攤上這事纺涤∫朐荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵撩炊,是天一觀(guān)的道長(zhǎng)外永。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拧咳,這世上最難降的妖魔是什么伯顶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮骆膝,結(jié)果婚禮上祭衩,老公的妹妹穿的比我還像新娘。我一直安慰自己阅签,他們只是感情好掐暮,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著政钟,像睡著了一般路克。 火紅的嫁衣襯著肌膚如雪樟结。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天精算,我揣著相機(jī)與錄音瓢宦,去河邊找鬼。 笑死灰羽,一個(gè)胖子當(dāng)著我的面吹牛驮履,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谦趣,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疲吸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了前鹅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤峭梳,失蹤者是張志新(化名)和其女友劉穎舰绘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體葱椭,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捂寿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孵运。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秦陋。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖治笨,靈堂內(nèi)的尸體忽然破棺而出驳概,到底是詐尸還是另有隱情,我是刑警寧澤旷赖,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布顺又,位于F島的核電站,受9級(jí)特大地震影響等孵,放射性物質(zhì)發(fā)生泄漏稚照。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一俯萌、第九天 我趴在偏房一處隱蔽的房頂上張望果录。 院中可真熱鬧,春花似錦咐熙、人聲如沸弱恒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斤彼。三九已至分瘦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琉苇,已是汗流浹背嘲玫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留并扇,地道東北人去团。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像穷蛹,于是被迫代替她去往敵國(guó)和親土陪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,336評(píng)論 25 707
  • 設(shè)計(jì)模式匯總 一肴熏、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用鬼雀、多...
    MinoyJet閱讀 3,949評(píng)論 1 15
  • 兩張圖片拼成上下相接的一張圖片(曾經(jīng)一次面試的題目)
    冥冥之中遠(yuǎn)_閱讀 2,657評(píng)論 0 1
  • “那些叛逆的年輕人毫無(wú)可愛(ài)可言, 他們叼著煙蛙吏, 他們是身上布滿(mǎn)荊棘源哩, 但他們勇敢, 他們仇視父權(quán)鸦做, 他們渴望簡(jiǎn)單励烦,...
    關(guān)馨仁閱讀 639評(píng)論 6 7
  • 下載node # wget https://nodejs.org/dist/v7.2.1/node-v7.2.1-...
    dotdiw閱讀 181評(píng)論 0 0