設(shè)計(jì)模式之單例模式學(xué)習(xí)筆記

單例

概念:整個(gè)應(yīng)用或系統(tǒng)只能有該類的一個(gè)實(shí)例,即是在整個(gè)項(xiàng)目中,這個(gè)類的對(duì)象只能被初始化一次愚隧。單例類保證了應(yīng)用程序的生命周期中有且僅有一個(gè)該類的實(shí)例對(duì)象,而且易于外界訪問锻全。

特點(diǎn)

內(nèi)存占用與運(yùn)行時(shí)間

對(duì)比使用單例模式和非單例模式的例子狂塘,在內(nèi)存占用與運(yùn)行時(shí)間存在以下差距:

(1) 單例模式:?jiǎn)卫J矫看潍@取實(shí)例時(shí)都會(huì)先進(jìn)行判斷录煤,看該實(shí)例是否存在——如果存在,則返回荞胡;否則妈踊,則創(chuàng)建實(shí)例。因此泪漂,會(huì)浪費(fèi)一些判斷的時(shí)間廊营。但是,如果一直沒有人使用這個(gè)實(shí)例的話萝勤,那么就不會(huì)創(chuàng)建實(shí)例赘风,節(jié)約了內(nèi)存空間。

(2) 非單例模式:當(dāng)類加載的時(shí)候就會(huì)創(chuàng)建類的實(shí)例纵刘,不管你是否使用它邀窃。然后當(dāng)每次調(diào)用的時(shí)候就不需要判斷該實(shí)例是否存在了,節(jié)省了運(yùn)行的時(shí)間假哎。但是如果該實(shí)例沒有使用的話瞬捕,就浪費(fèi)了內(nèi)存。

線程的安全性

(1) 從線程的安全性上來講舵抹,不加同步的單例模式是不安全的肪虎。比如,有兩個(gè)線程惧蛹,一個(gè)是線程A扇救,另外一個(gè)是線程B,如果它們同時(shí)調(diào)用某一個(gè)方法香嗓,那就可能會(huì)導(dǎo)致并發(fā)問題迅腔。在這種情況下,會(huì)創(chuàng)建出兩個(gè)實(shí)例來靠娱,也就是單例的控制在并發(fā)情況下失效了沧烈。

(2) 非單例模式是線程安全的,因?yàn)槌绦虮WC只加載一次像云,在加載的時(shí)候不會(huì)發(fā)生并發(fā)情況锌雀。

(3) 單例模式如果要實(shí)現(xiàn)線程安全,只需要加上synchronized即可迅诬。但是這樣一來腋逆,就會(huì)減低整個(gè)程序的訪問速度,而且每次都要判斷侈贷,比較麻煩惩歉。

(4) 雙重檢查加鎖:為了解決(3)的繁瑣問題,可以使用“雙重檢查加鎖”的方式來實(shí)現(xiàn),這樣柬泽,就可以既實(shí)現(xiàn)線程安全,又能使得程序性能不受太大的影響嫁蛇。

單例模式會(huì)阻止其它對(duì)象實(shí)例化其自己的對(duì)象的副本锨并,從而確保所有對(duì)象都訪問唯一實(shí)例。

因?yàn)閱卫J降念惪刂屏藢?shí)例化的過程睬棚,所以類可以更加靈活修改實(shí)例化過程第煮。

基本步驟

(1) 為單例對(duì)象創(chuàng)建一個(gè)靜態(tài)實(shí)例,可以寫成全局的抑党,也可以在類方法里面實(shí)現(xiàn)包警,并初始化為nil;

(2) 實(shí)現(xiàn)一個(gè)實(shí)例構(gòu)造方法底靠,檢查上面聲明的靜態(tài)實(shí)例是否為nil害晦,如果是,則創(chuàng)建并返回一個(gè)本類的實(shí)例暑中;

(3) 重寫allocWithZone方法壹瘟,用來保證其他人直接使用alloc和init試圖獲得一個(gè)新實(shí)力的時(shí)候不產(chǎn)生一個(gè)新實(shí)例;

(4) 適當(dāng)實(shí)現(xiàn)allocWitheZone鳄逾,copyWithZone稻轨,release和autorelease。

static ZYSingleton* _instance = nil;

+(instancetype)shareInstance

{

///加上GCD代碼是為了防止多個(gè)線程同時(shí)訪問這個(gè)類雕凹,從而造成產(chǎn)生多個(gè)實(shí)例

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_instance = [[super allocWithZone:NULL] init];

});

return _instance;

}

+(id)allocWithZone:(struct _NSZone *)zone

{

return [ZYSingleton shareInstance];

}

-(id) copyWithZone:(struct _NSZone *)zone

{

return [ZYSingleton shareInstance];

}


:GCD的代碼也可以使用以下部分代替殴俱,但以下的代碼性能不好:

?@synchronized (self) {

? ? ? ?// 為了防止多線程同時(shí)訪問對(duì)象,造成多次分配內(nèi)存空間枚抵,所以要加上線程鎖

? ? ? ?if (_instance == nil) {

? ? ? ? ? ? _instance = [super allocWithZone:zone];

? ? ? ?}

? ? ? ? return _instance;

? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末线欲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子汽摹,更是在濱河造成了極大的恐慌询筏,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竖慧,死亡現(xiàn)場(chǎng)離奇詭異嫌套,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)圾旨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門踱讨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砍的,你說我怎么就攤上這事痹筛。” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵帚稠,是天一觀的道長(zhǎng)谣旁。 經(jīng)常有香客問我,道長(zhǎng)滋早,這世上最難降的妖魔是什么榄审? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮杆麸,結(jié)果婚禮上搁进,老公的妹妹穿的比我還像新娘。我一直安慰自己昔头,他們只是感情好饼问,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揭斧,像睡著了一般莱革。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讹开,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天驮吱,我揣著相機(jī)與錄音,去河邊找鬼萧吠。 笑死左冬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纸型。 我是一名探鬼主播拇砰,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼狰腌!你這毒婦竟也來了除破?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤琼腔,失蹤者是張志新(化名)和其女友劉穎瑰枫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丹莲,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡光坝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甥材。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盯另。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洲赵,靈堂內(nèi)的尸體忽然破棺而出鸳惯,到底是詐尸還是另有隱情商蕴,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布芝发,位于F島的核電站绪商,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辅鲸。R本人自食惡果不足惜格郁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓢湃。 院中可真熱鬧,春花似錦赫蛇、人聲如沸绵患。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽落蝙。三九已至,卻和暖如春暂幼,著一層夾襖步出監(jiān)牢的瞬間筏勒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工旺嬉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留管行,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓邪媳,卻偏偏與公主長(zhǎng)得像捐顷,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雨效,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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