淺談Objective-C設(shè)計(jì)模式(Design Pattern)

常見(jiàn)代碼問(wèn)題:
1烁登、代碼膨脹,代碼達(dá)百萬(wàn)行甚至千萬(wàn)行蔚舀。
2饵沧、代碼的理解和調(diào)試占用較多時(shí)間。
3赌躺、代碼交互復(fù)雜狼牺、模塊相互引用、接口網(wǎng)狀分布礼患。
4是钥、代碼難以修改掠归,易引入新的問(wèn)題,改代碼的時(shí)候戰(zhàn)戰(zhàn)兢兢咏瑟。
5拂到、類(lèi)、方法太復(fù)雜,代碼行太多。
6捺疼、重復(fù)代碼窃植、無(wú)效代碼太多。
7悯森、接口不明確宋舷。

為什么要用設(shè)計(jì)模式:
設(shè)計(jì)模式使代碼編制真正工程化;
設(shè)計(jì)模式是軟件工程的基石脈絡(luò)瓢姻,如同大廈的結(jié)構(gòu)一樣祝蝠。

設(shè)計(jì)模式遵循的原則:
1、一個(gè)類(lèi)應(yīng)該只有一個(gè)發(fā)生變化的原因幻碱。
2绎狭、如果調(diào)用的是父類(lèi)的話(huà),那么換成子類(lèi)也完全可以運(yùn)行褥傍。
3儡嘶、抽象不應(yīng)該依賴(lài)于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴(lài)于抽象恍风。面向接口編程蹦狂,而不是面向?qū)崿F(xiàn)編程。
4朋贬、使用多個(gè)專(zhuān)門(mén)的接口比使用單一的總接口要好凯楔。
客戶(hù)端不應(yīng)該依賴(lài)它不需要的接口;
一個(gè)類(lèi)對(duì)另一個(gè)類(lèi)的依賴(lài)應(yīng)該建立在最小的接口上锦募。
5摆屯、模塊應(yīng)對(duì)擴(kuò)展開(kāi)放,而對(duì)修改關(guān)閉御滩。
6鸥拧、一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少的了解。每個(gè)類(lèi)盡量減少對(duì)其他類(lèi)的依賴(lài)削解。

1.創(chuàng)建型:
單例設(shè)計(jì)模式
抽象工廠設(shè)計(jì)模式

2.結(jié)構(gòu)型:
MVC 模型:
裝飾器模式:
適配器模式:Category(類(lèi)別)和Delegation(委托)
外觀模式:外觀模式針對(duì)復(fù)雜的子系統(tǒng)提供了單一的接口富弦,不需要暴漏一些列的類(lèi)和API給用戶(hù),你僅僅暴漏一個(gè)簡(jiǎn)單統(tǒng)一的API氛驮。
組合模式:

3.行為型:
責(zé)任鏈設(shè)計(jì)模式:
觀察者設(shè)計(jì)模式:Notification(通知)機(jī)制 和 KVO機(jī)制
備忘錄設(shè)計(jì)模式:
命令設(shè)計(jì)模式:

設(shè)計(jì)模式:
實(shí)例方法腕柜,類(lèi)方法,便利構(gòu)造方法
extention(延展) ,Category(類(lèi)別)
KVC
KVO:觀察者的注冊(cè)是在被觀察者的內(nèi)部進(jìn)行的盏缤,不同于通知機(jī)制(由觀察者自己注冊(cè))砰蠢,需要被觀察者和觀察者同時(shí)實(shí)現(xiàn)一個(gè)協(xié)議:NSKeyValueObserving,被觀察者通過(guò)addObserver:forKeypath:options:context方法注冊(cè)觀察者唉铜,以及要被觀察的屬性台舱。
Delegate(代理):java中的接口,類(lèi)可以實(shí)現(xiàn)或不實(shí)現(xiàn)協(xié)議(接口)中的方法潭流。通過(guò)此種方式竞惋,達(dá)到最大的解耦目的,方便項(xiàng)目的擴(kuò)展灰嫉。
Sington(單例)
Notification(通知)機(jī)制
block(回調(diào))

何為單例模式:一個(gè)類(lèi)在系統(tǒng)中只有一個(gè)實(shí)例對(duì)象拆宛。通過(guò)全局的一個(gè)入口點(diǎn)對(duì)這個(gè)實(shí)例對(duì)象進(jìn)行訪問(wèn)。整個(gè)應(yīng)用或系統(tǒng)只能有該類(lèi)的一個(gè)實(shí)例

單例模式靜態(tài)類(lèi)圖:
技術(shù)要點(diǎn):
1讼撒、某個(gè)類(lèi)只能有一個(gè)實(shí)例
2浑厚、它必須自行創(chuàng)建這個(gè)實(shí)例
3、它必須向整個(gè)系統(tǒng)提供這個(gè)實(shí)例

何時(shí)使用單例模式:
1根盒、只能共享而不能復(fù)制的資源钳幅,如CLLocationManager類(lèi)。
2郑象、類(lèi)必須有一個(gè)實(shí)例贡这,而且必須從一個(gè)為人熟知的訪問(wèn)點(diǎn)對(duì)其進(jìn)行訪問(wèn),比如工 廠方法厂榛。

在Objective-C中實(shí)現(xiàn)單例模式:
1盖矫、如何保證類(lèi)只創(chuàng)建一個(gè)實(shí)例?因?yàn)镺C中所有方法都是共有的击奶。

Apple官方文檔里面關(guān)于單例(Singleton)的示范代碼:
static MyGizmoClass *sharedGizmoManager = nil;

  • (MyGizmoClass*)sharedManager
    {
    if (sharedGizmoManager == nil) {
    sharedGizmoManager = [[super allocWithZone:NULL] init];
    }

    return sharedGizmoManager;
    }

  • (id)allocWithZone:(NSZone *)zone //避免通過(guò)alloc和init獲取一個(gè)實(shí)例
    {
    return [[self sharedManager] retain];
    }

2辈双、克隆:如果該類(lèi)實(shí)現(xiàn)了NSCopying協(xié)議柜砾,則需要重寫(xiě)copyWithZone湃望。
3、線程安全:如果是多線程的話(huà)痰驱,可以使用@synchronized证芭、NSLock或者dispatch_once_t。

第二種方式:
//Singleton.h
@interface Singleton : NSObject

  • (Singleton *)sharedSingleton; <1>
    @end

/***************************************************************/

//Singleton.m

import "Singleton.h"

@implementation Singleton
static Singleton *sharedSingleton = nil;<2>

  • (Singleton *)sharedSingleton{
    static dispatch_once_t once;<3>
    dispatch_once(&once,^{
    sharedSingleton = [[self alloc] init];<4>
    //dosometing
    });
    return sharedSingleton;<5>
    }

<1>聲明一個(gè)可以新建和獲取單個(gè)實(shí)例對(duì)象的方法
<2>聲明一個(gè)static類(lèi)型的類(lèi)變量
<3>聲明一個(gè)只執(zhí)行一次的任務(wù)
<4>調(diào)用dispatch_once執(zhí)行該任務(wù)指定的代碼塊担映,在該代碼塊中實(shí)例化上文聲明的類(lèi)變量
<5>返回在整個(gè)應(yīng)用的生命周期中只會(huì)被實(shí)例化一次的變量

在Cocoa Touch框架中使用單例模式:舉例如下:
1废士、UIApplication,可通過(guò)sharedApplication類(lèi)方法訪問(wèn)蝇完。
2官硝、UIAccelerometer矗蕊,可通過(guò)sharedAccelerometer訪問(wèn)。
3氢架、NSFileManager傻咖,可通過(guò)defaultFileManager訪問(wèn)。
4岖研、NSBundle類(lèi)提供了 +mainBunle方法獲取NSBundle單例
5卿操、NSNotificationCenter提供了 +defaultCenter方法創(chuàng)建和獲取NSNotificationCenter單例(PS:該類(lèi)還遵循了另一個(gè)重要的設(shè)計(jì)模式:觀察者模式)
6,NSUserDefaults類(lèi)提供了 +defaultUserDefaults方法去創(chuàng)建和獲取NSUserDefaults單例

簡(jiǎ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)的值骇。

簡(jiǎn)單工廠模式中,工廠類(lèi)是整個(gè)模式的關(guān)鍵移国,其包含必要的判斷邏輯吱瘩,能夠根據(jù)外界給定的信息,決定究竟創(chuàng)建哪個(gè)類(lèi)的實(shí)例迹缀,外界可以不用去關(guān)注對(duì)象的創(chuàng)建使碾,僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了。

專(zhuān)門(mén)定義一個(gè)類(lèi)來(lái)負(fù)責(zé)創(chuàng)建其他類(lèi)的實(shí)例祝懂,被創(chuàng)建的實(shí)例通常都具有共同的父類(lèi)票摇,又稱(chēng)為靜態(tài)工廠方法,我們習(xí)慣稱(chēng)這個(gè)為:實(shí)例方法砚蓬。

優(yōu)缺點(diǎn):
1矢门、優(yōu)點(diǎn):明確區(qū)分了責(zé)任,有利于結(jié)構(gòu)的優(yōu)化灰蛙。從面向?qū)崿F(xiàn)類(lèi)編碼轉(zhuǎn)換為面向接口編程祟剔。
2、缺點(diǎn):集中了所有實(shí)例的創(chuàng)建邏輯摩梧,違反了高內(nèi)聚的責(zé)任分配原則物延,當(dāng)系統(tǒng)的具體產(chǎn)品類(lèi)不斷增多時(shí),工廠類(lèi)中條件判斷過(guò)多障本,不利于擴(kuò)展及維護(hù)教届。

工廠方法模式:

定義創(chuàng)建對(duì)象的接口响鹃,讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi),工廠方法使得一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)案训。

簡(jiǎn)單說(shuō)买置,工廠方法模式,就是針對(duì)不同的產(chǎn)品强霎,使用不同的工廠類(lèi)創(chuàng)建不同的工廠對(duì)象然后生產(chǎn)不同的產(chǎn)品忿项。

何時(shí)使用工廠方法:
1、編譯時(shí)無(wú)法準(zhǔn)確預(yù)期要?jiǎng)?chuàng)建的對(duì)象的類(lèi)城舞。
2轩触、類(lèi)想讓其子類(lèi)決定在運(yùn)行時(shí)創(chuàng)建什么。

工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣家夺。由于使用了多態(tài)性脱柱,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)拉馋。

1.每新增一個(gè)產(chǎn)品類(lèi)榨为,對(duì)應(yīng)就要新建一個(gè)工廠類(lèi),如果產(chǎn)品比較多煌茴,必然會(huì)分配大量的工廠對(duì)象随闺,增加了額外的開(kāi)發(fā)量,這樣維護(hù)的成本勢(shì)必會(huì)增加蔓腐。

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

何為抽象工廠:
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口回论,而無(wú)需指定它們具體的類(lèi)散罕。

簡(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)品硫椰。

何時(shí)使用抽象工廠:
1、通過(guò)對(duì)象組合創(chuàng)建抽象產(chǎn)品萨蚕。
2靶草、創(chuàng)建多系列產(chǎn)品

抽象工廠模式是對(duì)象的創(chuàng)建模式,它是工廠方法模式的進(jìn)一步推廣岳遥。

工廠模式總結(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閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兔魂,居然都是意外死亡烤芦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)析校,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)构罗,“玉大人,你說(shuō)我怎么就攤上這事智玻∷爝螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵吊奢,是天一觀的道長(zhǎng)盖彭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)页滚,這世上最難降的妖魔是什么召边? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮裹驰,結(jié)果婚禮上隧熙,老公的妹妹穿的比我還像新娘。我一直安慰自己幻林,他們只是感情好贞盯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布音念。 她就那樣靜靜地躺著,像睡著了一般躏敢。 火紅的嫁衣襯著肌膚如雪闷愤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天父丰,我揣著相機(jī)與錄音肝谭,去河邊找鬼。 笑死蛾扇,一個(gè)胖子當(dāng)著我的面吹牛攘烛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镀首,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坟漱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了更哄?” 一聲冷哼從身側(cè)響起芋齿,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎成翩,沒(méi)想到半個(gè)月后觅捆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡麻敌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年栅炒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片术羔。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赢赊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出级历,到底是詐尸還是另有隱情释移,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布寥殖,位于F島的核電站玩讳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嚼贡。R本人自食惡果不足惜锋边,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望编曼。 院中可真熱鬧豆巨,春花似錦、人聲如沸掐场。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至萍膛,卻和暖如春吭服,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝗罗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工艇棕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人串塑。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓沼琉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親桩匪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子打瘪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用傻昙、多...
    MinoyJet閱讀 3,906評(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,587評(píng)論 18 399
  • 一贾惦、設(shè)計(jì)模式的分類(lèi) 總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類(lèi): 創(chuàng)建型模式进泼,共五種:工廠方法模式、抽象工廠模式纤虽、單例模式、建造者...
    RamboLI閱讀 744評(píng)論 0 1
  • 創(chuàng)建型模式 抽象工廠模式(abstract facroty) 3.1模式動(dòng)機(jī) 在工廠方法模式中具體工廠負(fù)責(zé)生產(chǎn)具體...
    僚機(jī)KK閱讀 722評(píng)論 0 2
  • 一绞惦、設(shè)計(jì)模式的分類(lèi) 總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類(lèi): 創(chuàng)建型模式逼纸,共五種:工廠方法模式、抽象工廠模式济蝉、單例模式杰刽、建造者...
    lichengjin閱讀 887評(píng)論 0 8