MY_iOS常用設(shè)計(jì)模式總結(jié)

iOS常用設(shè)計(jì)模式總結(jié)(一)

設(shè)計(jì)模式大概分成三類(lèi):
1.創(chuàng)建型:?jiǎn)卫O(shè)計(jì)模式错森、抽象工廠設(shè)計(jì)模式
2.結(jié)構(gòu)型:MVC 模式、裝飾器模式篮洁、適配器模式涩维、外觀模式、組合模式
3.行為型:責(zé)任鏈設(shè)計(jì)模式嘀粱、觀察者設(shè)計(jì)模式激挪,備忘錄設(shè)計(jì)模式、命令設(shè)計(jì)模式
MVC模式:
涉及到的三個(gè)角色如下:
Model:
模型保存應(yīng)用程序的數(shù)據(jù)锋叨,定義了怎么去操作它垄分。例如在本應(yīng)用中模型就是Album類(lèi)。
View:
視圖是模型的可視化表示以及用戶(hù)交互的控件娃磺;基本上來(lái)說(shuō)薄湿,所有的UIView對(duì)象以及它的子類(lèi)都屬于視圖。在本應(yīng)用中AlbumView代表了視圖偷卧。
Controller:
控制器是一個(gè)協(xié)調(diào)所有工作的中介者(Mediator)豺瘤。它訪問(wèn)模型中的數(shù)據(jù)并在視圖中展示它們,同時(shí)它們還監(jiān)聽(tīng)事件和根據(jù)需要操作數(shù)據(jù)听诸。你可以猜猜哪個(gè)類(lèi)是控制器嗎坐求?它正是:ViewController。
MVC遵循以下的原則:
在理想的狀態(tài)下晌梨,視圖應(yīng)該和模型完全的分離桥嗤。如果視圖不依賴(lài)某個(gè)實(shí)際的模型,那么視圖就可以被復(fù)用來(lái)展示不同模型的數(shù)據(jù)仔蝌。

MVC模式示意圖.png

單例設(shè)計(jì)模式有如下特點(diǎn):

1.單例設(shè)計(jì)模式確保對(duì)于一個(gè)給定的類(lèi)只有一個(gè)實(shí)例存在泛领,這個(gè)實(shí)例有一個(gè)全局唯一的訪問(wèn)點(diǎn)。

2.它通常采用延遲加載的方式在第一次用到實(shí)例的時(shí)候再去創(chuàng)建它敛惊。

[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager]渊鞋,所有的這些方法都返回一個(gè)單例對(duì)象

單例模式實(shí)現(xiàn)步驟:

1.聲明一個(gè)靜態(tài)變量去保存類(lèi)的實(shí)例,確保它在類(lèi)中的全局可用性瞧挤。

2.聲明一個(gè)靜態(tài)變量dispatch_once_t ,它確保初始化器代碼只執(zhí)行一次

3.使用Grand Central Dispatch(GCD)執(zhí)行初始化LibraryAPI變量的block.這 正是單例模式的關(guān)鍵:一旦類(lèi)已經(jīng)被初始化锡宋,初始化器永遠(yuǎn)不會(huì)再被調(diào)用。

下一次你調(diào)用sharedInstance的時(shí)候特恬,dispatch_once塊中的代碼將不會(huì)執(zhí)行(因?yàn)樗呀?jīng)被執(zhí)行了一次)员辩,你將得到原先已經(jīng)初始化好的實(shí)例。

外觀模式Facade:

特點(diǎn):

  1. 外觀模式針對(duì)復(fù)雜的子系統(tǒng)提供了單一的接口鸵鸥,不需要暴漏一些列的類(lèi)和API給用戶(hù),你僅僅暴漏一個(gè)簡(jiǎn)單統(tǒng)一的API。

2.使用者完全不需要關(guān)心背后的復(fù)雜性妒穴。這個(gè)模式非常適合有一大堆很難使用或者理解的類(lèi)的情況宋税。

3.外觀模式解耦了使用系統(tǒng)的代碼和需要隱藏的接口和實(shí)現(xiàn)類(lèi)。它也降低了外部代碼對(duì)內(nèi)部子系統(tǒng)的依賴(lài)性讼油。當(dāng)隱藏在門(mén)面之后的類(lèi)很容易發(fā)生變化的時(shí)候杰赛,此模式就很有用了,因?yàn)楫?dāng)背后的類(lèi)發(fā)生變化的時(shí)候矮台,門(mén)面類(lèi)始終保持了同樣的API乏屯。

應(yīng)用場(chǎng)景:

假如某個(gè)模塊需要對(duì)一些數(shù)據(jù)做展示,這些數(shù)據(jù)的來(lái)源可能是不同數(shù)據(jù)庫(kù)瘦赫、可能是通過(guò)網(wǎng)絡(luò)請(qǐng)求返回辰晕,總之載入數(shù)據(jù)的過(guò)程及其復(fù)雜,這時(shí)候可以合理運(yùn)用外觀模式确虱,封裝復(fù)雜的數(shù)據(jù)加載處理過(guò)程含友,對(duì)外公開(kāi)簡(jiǎn)單的接口返回?cái)?shù)據(jù)。

Facade模式示意圖.png

裝飾器(Decorator)模式

裝飾器模式在不修改原來(lái)代碼的情況下動(dòng)態(tài)的給對(duì)象(而不是類(lèi))增加新的行為和職責(zé)校辩,它通過(guò)一個(gè)對(duì)象包裝被裝飾對(duì)象的方法來(lái)修改類(lèi)的行為窘问,這種方法可以做為子類(lèi)化的一種替代方法。相對(duì)而言這種方式比子類(lèi)繼承更為靈活宜咒。

在Objective-C中惠赫,存在兩種非常常見(jiàn)的實(shí)現(xiàn):Category(類(lèi)別)和Delegation(委托)。

注意:如果方法與原來(lái)類(lèi)的方法重名了故黑,或者與同樣的類(lèi)(甚至它的父類(lèi))的其它的擴(kuò)展重名儿咱,那么運(yùn)行期到底應(yīng)該調(diào)用哪個(gè)方法是未定義的。當(dāng)你僅僅是在擴(kuò)展你自己寫(xiě)的類(lèi)時(shí)倍阐,這沒(méi)什么問(wèn)題概疆, 但是當(dāng)你在擴(kuò)展標(biāo)準(zhǔn)的Cocoa 或者Cocoa Touch類(lèi)的時(shí)候,它可能會(huì)導(dǎo)致嚴(yán)重的問(wèn)題峰搪。

裝飾器模式.png

簡(jiǎn)單工廠模式

初衷:在某個(gè)模塊中岔冀,如果有大量的分配(new)釋放(delete)某些對(duì)象操作。

這類(lèi)操作如果過(guò)多概耻,分散在各處使套,這樣會(huì)非常難以管理,代碼將會(huì)很亂鞠柄,維護(hù)起來(lái)也很困難侦高。

new操作經(jīng)常要對(duì)應(yīng)編寫(xiě)一些異常處理代碼,這時(shí)編碼變得極其混亂和臃腫厌杜。

在這種情況下奉呛,要解決這些問(wèn)題计螺,我們需要一個(gè)新的類(lèi)。專(zhuān)門(mén)從事對(duì)象的建立和釋放瞧壮,之后登馒,對(duì)象的各種操作,與這個(gè)類(lèi)就不再有任何關(guān)系咆槽。

這個(gè)類(lèi)即是工廠類(lèi)陈轿,專(zhuān)門(mén)用于創(chuàng)建對(duì)象,向外暴露創(chuàng)建對(duì)象的接口秦忿,供外部調(diào)用麦射。

工廠模式有一種非常形象的描述,建立對(duì)象的類(lèi)就如一個(gè)工廠灯谣,而需要被建立的對(duì)象就是一個(gè)個(gè)產(chǎn)品潜秋;在工廠中加工產(chǎn)品,使用產(chǎn)品的人酬屉,

不用在乎產(chǎn)品是如何生產(chǎn)出來(lái)的半等。從軟件開(kāi)發(fā)的角度來(lái)說(shuō),這樣就有效的降低了模塊之間的耦合呐萨。

簡(jiǎn)單工廠模式示意圖:

簡(jiǎn)單工廠模式.png

簡(jiǎn)單工廠模式有以下弱點(diǎn):

1.如果要新增一個(gè)產(chǎn)品杀饵,這樣必須在代碼層次增加產(chǎn)品類(lèi)別,不具有自動(dòng)擴(kuò)展的靈活性谬擦。而頻繁多次修改曾經(jīng)已經(jīng)測(cè)試過(guò)的代碼切距,在項(xiàng)目開(kāi)發(fā)中是很忌諱的事情。

工廠方法模式

為了解決上述簡(jiǎn)單工廠模式的弱點(diǎn)惨远,出現(xiàn)了工廠方法模式

簡(jiǎn)單說(shuō)谜悟,工廠方法模式,就是針對(duì)不同的產(chǎn)品北秽,使用不同的工廠類(lèi)創(chuàng)建不同的工廠對(duì)象然后生產(chǎn)不同的產(chǎn)品葡幸。

也就是一個(gè)工廠類(lèi)對(duì)應(yīng)一類(lèi)產(chǎn)品。

這樣需要新建一類(lèi)產(chǎn)品的時(shí)候贺氓,需要新建一個(gè)工廠類(lèi)蔚叨,同時(shí)對(duì)應(yīng)擴(kuò)展一個(gè)產(chǎn)品類(lèi)

這種設(shè)計(jì)模式的缺點(diǎn)也是顯而易見(jiàn)的:

1.每新增一個(gè)產(chǎn)品類(lèi),對(duì)應(yīng)就要新建一個(gè)工廠類(lèi)辙培,如果產(chǎn)品比較多蔑水,必然會(huì)分配大量的工廠對(duì)象,這樣維護(hù)的成本勢(shì)必會(huì)增加扬蕊。

2.既然每個(gè)產(chǎn)品的工廠類(lèi)都徹底分開(kāi)獨(dú)立搀别,這樣某些可以復(fù)用的代碼塊將無(wú)法復(fù)用。

工廠方法模式:

工廠方法模式.png

為了解決工廠方法模式的上述缺陷尾抑,出現(xiàn)了抽象工廠模式

抽象工廠模式在一定的程度上借鑒了簡(jiǎn)單工廠模式和工廠方法模式的優(yōu)點(diǎn)歇父,同時(shí)抑制了其缺點(diǎn)蒂培。

簡(jiǎn)單說(shuō),抽象工廠在一定程度上對(duì)具有共性產(chǎn)品做了歸類(lèi)庶骄,并對(duì)應(yīng)實(shí)現(xiàn)了生產(chǎn)該類(lèi)產(chǎn)品工廠類(lèi)毁渗。

此時(shí)的工廠類(lèi)與工廠方法模式下的工廠類(lèi)的主要區(qū)別在于,這種工廠類(lèi)并不局限于創(chuàng)建某個(gè)特定類(lèi)的產(chǎn)品单刁,而是根據(jù)需要可以創(chuàng)建具體類(lèi)型不同的產(chǎn)品。

抽象工廠模式示意圖:

抽象工廠模式示意圖.png

工廠模式總結(jié):

應(yīng)用場(chǎng)景:

1.在設(shè)計(jì)的初期府适,就考慮到產(chǎn)品在后期會(huì)進(jìn)行大規(guī)模擴(kuò)展的情況下羔飞,應(yīng)當(dāng)使用工廠方法模式;

2.產(chǎn)品結(jié)構(gòu)較復(fù)雜的情況下檐春,建議使用工廠方法模式逻淌;

3.工廠方法模式適用于產(chǎn)品種類(lèi)結(jié)構(gòu)單一的場(chǎng)合,為一類(lèi)產(chǎn)品提供創(chuàng)建的接口疟暖;

4.而抽象工廠方法適用于產(chǎn)品種類(lèi)結(jié)構(gòu)多的場(chǎng)合卡儒,主要用于創(chuàng)建一組(有多個(gè)種類(lèi))相關(guān)的產(chǎn)品,為它們提供創(chuàng)建的接口俐巴;就是當(dāng)具有多個(gè)抽象角色時(shí)骨望,抽象工廠便可以派上用場(chǎng)。

5.至于簡(jiǎn)單工廠模式欣舵,適合類(lèi)型單一擎鸠,但是多個(gè)場(chǎng)合下頻繁創(chuàng)建銷(xiāo)毀的情況,當(dāng)后期需要大規(guī)模擴(kuò)展時(shí)缘圈,不適宜使用簡(jiǎn)單工廠模式劣光。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市糟把,隨后出現(xiàn)的幾起案子绢涡,更是在濱河造成了極大的恐慌,老刑警劉巖遣疯,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雄可,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡另锋,警方通過(guò)查閱死者的電腦和手機(jī)滞项,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)夭坪,“玉大人文判,你說(shuō)我怎么就攤上這事∈颐罚” “怎么了戏仓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵疚宇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赏殃,道長(zhǎng)敷待,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任仁热,我火速辦了婚禮榜揖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抗蠢。我一直安慰自己举哟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布迅矛。 她就那樣靜靜地躺著妨猩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秽褒。 梳的紋絲不亂的頭發(fā)上壶硅,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音销斟,去河邊找鬼庐椒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛票堵,可吹牛的內(nèi)容都是我干的扼睬。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼悴势,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窗宇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起特纤,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤军俊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后捧存,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粪躬,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年昔穴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镰官。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吗货,死狀恐怖泳唠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宙搬,我是刑警寧澤笨腥,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布拓哺,位于F島的核電站,受9級(jí)特大地震影響脖母,放射性物質(zhì)發(fā)生泄漏士鸥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一谆级、第九天 我趴在偏房一處隱蔽的房頂上張望烤礁。 院中可真熱鬧,春花似錦肥照、人聲如沸鸽凶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至决摧,卻和暖如春亿蒸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掌桩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工边锁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人波岛。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓茅坛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親则拷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贡蓖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用煌茬、多...
    MinoyJet閱讀 3,922評(píng)論 1 15
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法斥铺,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法坛善,繼承相關(guān)的語(yǔ)法晾蜘,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,602評(píng)論 18 399
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,864評(píng)論 25 707
  • 《重要的事情說(shuō)三點(diǎn)》P64 R·閱讀原文片段 例如眠屎,在提出“希望明天開(kāi)始請(qǐng)3天假”是請(qǐng)求后 你又加上“我已經(jīng)好久沒(méi)...
    iliveinhere閱讀 137評(píng)論 2 0
  • 今天改卷子的時(shí)候剔交,在所在教室的黑板報(bào)上看到了一段話,覺(jué)得頗有感觸改衩。那段話的原文已經(jīng)不記得了岖常,我印象比較深得主要是...
    悠悠6547閱讀 539評(píng)論 1 3