單例模式詳解

2021-06-22 23:30:43 字數 2974 閱讀 8825

單例模式的意思就是只有乙個例項。單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。

1.單例模式的要點:

顯然單例模式的要點有三個;一是某個類只能有乙個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。

2.單例模式的優點:

1.例項控制:singleton 會阻止其他物件例項化其自己的 singleton 物件的副本,從而確保所有物件都訪問唯一例項。

2.靈活性:因為類控制了例項化過程,所以類可以更加靈活修改例項化過程

ios中的單例模式

在objective-c中要實現乙個單例類,至少需要做以下四個步驟:

1、為單例物件實現乙個靜態例項,並初始化,然後設定成nil,

2、實現乙個例項構造方法檢查上面宣告的靜態例項是否為nil,如果是則新建並返回乙個本類的例項,

3、重寫allocwithzone方法,用來保證其他人直接使用alloc和init試圖獲得乙個新實力的時候不產生乙個新例項,

4、適當實現allocwithezone,copywithzone,release和autorelease。

下面用幾種demo來演示以下

第一種

.h+ (singleton *)getinstance;

.m+ (singleton *)getinstance 

}return sharedsingleton_;

}+(id)allocwithzone:(nszone *)zone

- (id) copywithzone:(nszone*)zone  

- (id) retain

- (nsuinteger) retaincount

//oneway用在分布式物件的api,這些api可以在不同的執行緒,甚至是不同的程式。oneway關鍵字只用在返回型別為void的訊息定義中, 因為oneway是非同步的,其訊息預計不會立即返回。

-(oneway void)release

- (id) autorelease

第二種
啟用arc
static rootviewcontroller* sharedrootcontroller = nil;

+(rootviewcontroller *) sharedcontroller

}return singlecontroller;

}

單例模式的優缺點
時間和空間
懶漢式是典型的時間換空間,就是每次獲取例項都會進行判斷,看是否需要建立例項,浪費判斷時間。如果一直沒有人使用,就不會建立例項,則節省記憶體空間
餓漢式是典型的空間換時間,當類載入的時候建立類例項,不管你用不用,先建立出來,然後每次呼叫的時候,就不需要判斷了,節省執行時間
執行緒安全
從執行緒安全上講,不加同步的懶漢式是執行緒不安全的。比如兩個執行緒,同時呼叫getinsance方法,就可能導致併發問題
餓漢式是執行緒安全的,因為虛擬機器保證只會裝載一次,在裝載的時候不會發生併發
如何實現懶漢式執行緒的安全
只要加上synchronized即可
public static synchronized singleton getinstance(){}
這樣一來,會降低整體的訪問速度,而且每次都要判斷,那麼有沒有更好的實現方式
雙重檢查加鎖
所謂的雙重加鎖機制,指的是:並不是每次進入getinstance方法都需要同步,而是先不同步,進入方法後,檢查例項是否存在,如果不存在進入下面的同步塊,這是第一重檢查,進入同步塊,再次檢查例項的是否存在,如果不存在,就在同步的情況下建立乙個例項,這是第二重檢查。這樣一來,就只需要同步一次,從而減少多次在同步情況下判斷所浪費的時間
雙重檢查加鎖機制的實現會使用乙個關鍵字volatile,他得意思是,被volatile修飾的變數的值,將不會被本地執行緒快取,所有對該變數的讀寫都是直接操作共享記憶體,從而確保多個執行緒能正確的處理該變數
public class singleton
public static singleton getinstance()
}
return instance;
}
}
這種實現方式既可以實現執行緒安全地建立例項,又不會對執行緒造成太大影響,它只在第一次建立例項的時候同步,以後就不要同步了,從而加快了執行速度
第三種
例子:為rootviewcontroller建立乙個單例函式:

static rootviewcontroller *sharerootviewcontroller = nil;

+(rootviewcontroller *)sharedcontroller

}return sharerootviewcontroller;

}+(id)allocwithzone:(nszone *)zone

}return nil;

}nszone: 簡單來說可以把它想象成乙個記憶體池,alloc或者dealloc這些操作都是在這個記憶體池中操作的,cocoa總是會分配乙個預設的nszone,任何 預設記憶體操作都是在這個zone上進行的,使用預設zone存在缺陷,因為他是全域性範圍的,頻繁使用會導致記憶體的碎片化,尤其是大量的alloc和 dealloc的時候,效能上會受到一定影響。因為你完全可以自己生成乙個zone並將alloc,copy這些限制在這個zone中。

第四種
執行緒控制 (個人認為最好的一種)

+ (singleton

*)sharedinstance

);return _instance;

}

單例模式詳解

單例模式是設計模式中比較常用的,今天我要詳細的了解一下,並且進行一些比較 public class singleton public static singleton getinstance catch interruptedexception e 單例模式的精髓就在這,類的內部可以new inst...

單例模式 詳解

保證乙個類僅有乙個例項,並且提供乙個訪問它的全域性訪問點 在該例項不存在的情況下,可以通過乙個方法建立乙個類來實現建立類的新例項 如果例項已經存在,它會簡單返回該物件的引用 建立型模式 var singleton function return var singlea singleton.getin...

單例模式詳解

我們在設計某些類時,根據需求,有時只需要乙個例項,不想過多浪費記憶體,這就可以通過單例項的方式。如,我們在使用windows的任務管理器時,彈出的始終是乙個視窗,這裡如果物件採用多例項模式,那麼就會彈出多個視窗,會出現下述兩種情況 第一,如果這些視窗顯示的內容不一致,則意味著在某一瞬間系統有多個狀態...