iOS設計模式之單例模式

前文提要:

之前簡友說讓舉栗子,那么今天我們就來舉栗子。
前文傳送門:
iOS設計模式、架構模式、框架簡介之《設計模式簡介》
iOS設計模式之基本規范

單例模式

單例模式--只有一個栗子

  好了,大家都看到了,單例就是只有一個栗子,為什么只有一個呢。。。。這個嘛.....聽我細細說來。
  為什么會需要單例模式這種設計模式呢?當某個對象在整個程序中我們只需要一個,并且我們需要在不同的地方調用這個對象,獲取其中的屬性資源。這種時候我們就需要用到單例模式這種設計模式。比如蘋果的application,以及AFN框架中的AFNetworkReachabilityManager都是單例。我們可以在不同的地方用shared/default方式訪問
[UIApplication sharedApplication]
[AFNetworkReachabilityManager sharedManager]
獲取到對應的單例,并訪問我們需要的資源。
  那么我們需要怎么實現單例模式呢?根據需求,我們要保證這個對象能且只能被創建一次,并且我們能在程序的任何地方訪問這個對象。
  為了保證單例模式在整個程序中只被創建一次,我們使用GCD 的dispatch_once函數能保證某段代碼在程序運行過程中只被執行1次

+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    //使用GCD中的一次性代碼
  static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
     _instance = [super allocWithZone:zone];
 });
    return _instance;
}

使用加鎖也是可以實現的,看個人愛好。

+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    //使用加鎖的方式,保證只分配一次存儲空間
    @synchronized(self) {
        if (_instance == nil) {
            _instance = [super allocWithZone:zone];
        }
    }
    return _instance;
}

我們為什么要在allocWithZone:這個方法里面寫實現方法呢?因為使用者可能并不知道你這個是個單例,有可能使用alloc init方式創建對象,而這樣就一定會來到allocWithZone:方法。為了防止其他意外,我們還必須實現以下兩個方法,防止使用者通過其他方式創建。

-(id)copyWithZone:(NSZone *)zone
{
    return _instance;
}

-(id)mutableCopyWithZone:(NSZone *)zone
{
    return _instance;
}

然后為了我們可以在程序的其他地方獲取他,并且參照iOS設計模式之基本規范;我們將它的API名稱參考蘋果的樣式,
使用:share+類名|default + 類名|share|類名

+(instancetype)sharedFXDGSingle;

+(instancetype)sharedFXDGSingle
{
    return [[self alloc]init];
}

在ARC和MRC環境下創建的方式也有所不同。下面給大家提供一個快速創建單例的宏

#define SingleH(name)  +(instancetype)shared##name;

//ARC
#if __has_feature(objc_arc)
#define SingleM(name) static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
    static dispatch_once_t onceToken;\
    dispatch_once(&onceToken, ^{\
        _instance = [super allocWithZone:zone];\
    });\
    return _instance;\
}\
+(instancetype)shared##name\
{\
    return [[self alloc]init];\
}\
-(id)copyWithZone:(NSZone *)zone\
{\
    return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
    return _instance;\
}

#else
//MRC
#define SingleM(name) static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
+(instancetype)shared##name\
{\
return [[self alloc]init];\
}\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
-(oneway void)release\
{\
}\
\
-(instancetype)retain\
{\
    return _instance;\
}\
\
-(NSUInteger)retainCount\
{\
    return MAXFLOAT;\
}
#endif

創建好后,就必須根據各自的需求增加屬性了,并提供對應的接口方法。

結語

單例模式是設計模式中最簡單的一個,設計模式主要還是體現的思想,需要在使用中多思考。之前有大神說代碼不超過5W行不要談設計模式,雖然有道理,但是并不贊同。
  設計模式本身源于生活,在IT行業出現之前很多領域已經有設計模式的概念,這些本是互通的。代碼再多不去想,也沒用。代碼少,但是有思想一樣可以創建出一個好的設計模式(前提是對編程規則熟悉)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容

  • 一. 單例模式簡介 單例模式的作用 可以保證在程序運行過程,一個類只有一個實例,而且該實例易于供外界訪問 從而方便...
    LeeQg666等ing閱讀 344評論 0 0
  • 這個是多年前寫的了,如今修改了下格式搬到了我們簡書網的平臺,希望大家喜歡。 單例模式是iOS設計模式中常用到的設計...
    茶哥兒閱讀 787評論 7 22
  • 單列模式:整個程序的生命周期內,只會創建一個類的實例化對象,而且只要程序還在運行,實例對象就不會釋放。 ·單例模式...
    墨凌風起閱讀 344評論 0 0
  • 我是一個很傳統的小女人,就連寫總結都是趕在春節寫,也許骨子里總認為元旦不是過年,春節才算,這一年我感覺自已...
    琳達豬小妹閱讀 290評論 0 0
  • 有時候在想,總覺得自己不如別人,很多地方也并不自信,但有時覺得自己也挺不錯,總是這么搖擺…… 愿你一切安好,晚安!
    何時再出發閱讀 175評論 2 0