正確單例的建立方法 Singleton設計模式

2021-07-15 13:38:46 字數 2507 閱讀 9733

建立單例必須注意的3個要點

一是某個類只能有乙個例項

二是它必須自行建立這個例項

三是它必須自行向整個系統提供這個例項

使用單例(singleton)的2個優點:

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

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

————————-方法1(別用)————————

01 首先建立乙個繼承於nsobject的乙個單例類,這裡以 instance.h為例。

具體的講解都在**注釋中,不一一瞎比比了:

在instance.h檔案中

#import 

@inte***ce

instance : nsobject

//宣告乙個單例類方法

+ (id)sharedinstance;

@end

02 在 instance.m 檔案中:

#import "instance.h"

@implementation

instance

//定義靜態全域性變數

static instance *instance = nil;

//單例類方法實現

+ (id)sharedinstance

//返回例項

return instance;

}@end

這樣乙個簡單的單例就完成了,但是,為了說一下為何不推薦這個方法,我們接著在控制器 viewcontroller.m檔案中演示一下。

03 在 viewcontroller.m 中

#import "viewcontroller.h"

#import "instance.h"

@inte***ce

viewcontroller ()

@end

@implementation

viewcontroller

- (void)viewdidload

@end

列印結果:

從列印結果可以發現:單例1和單例2的列印位址一樣,而單例3的位址不同,原因是什麼呢?很簡單,第3中的單例物件獲取的方式是重新建立了乙個單例例項,也就是說系統又alloc了一塊記憶體空間。而真正的獲取乙個單例例項我們通常用的是[instance sharedinstance],並且單例只能有乙個例項物件。當然,既然存在問題,那必然有解決的辦法,所以為了防止使用者有時獲取單例不慎採用了alloc的方法,這裡推薦相當好的乙個單例建立方法,看下面。

———————-方法2(正確的單例建立寫法)—————————–

04 同樣,在instance.h檔案中

#import 

@inte***ce

instance : nsobject

//宣告乙個單例類方法

+ (id)sharedinstance;

@end

05 在 instance.m 檔案中:

#import "instance.h"

@implementation

instance

//定義靜態全域性變數

static instance *instance = nil;

//單例的建立方法2

//多執行緒建立單例(推薦使用)

+ (id)sharedinstance );

//返回單例例項

return instance;

}//防止外部呼叫alloc,複寫系統自帶的alloc方法

+ (instancetype)allocwithzone:(struct _nszone *)zone

@end

注:為了防止使用者使用關鍵字copy導致單例不唯一,還需要重寫:copywithzone方法!!!06 在 viewcontroller.m 中,同03,這裡就不寫了,重點看一下列印結果:

顯然,儘管在控制器中的列印內容和方法1中的一樣,但列印結果卻是不同,這裡列印的三種結果中的位址相同,也就是說獲取到的是同乙個單例例項物件。所以,為了防止使用者使用 instance *instance3 = [[instance alloc] init]; 這樣的alloc建立獲取單例例項物件方法,推薦使用方法2多執行緒建立單例. 當然,網上還有很多建立單例的方法,大家可以嘗試比較一下哪種更好。

Java設計模式 單例模式(single)

目錄目的 應用例項 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。菜鳥教程 乙個國家有乙個首都 windows 是多程序多執行緒的,在操作乙個檔案的時候,就不可避免地出現多個程序或執行緒同時操作乙個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。第一種 package com.ga...

java單例模式的正確寫法

一 懶漢式 執行緒不安全 public class singleton public static singleton getinstance return instance 介紹 執行緒不安全,在多執行緒情況下容易建立多個例項。二 懶漢式 執行緒安全 public static synchroni...

dispatch once建立單例

無論是愛還是恨,你都需要單例。實際上每個ios或mac os應用都至少會有 什麼是單例呢?wikipedia是如此定義的 在軟體工程中,單例是一種用於實現單例的數學概念,即將類的例項化限制成僅乙個物件的設計模式。或者我的理解是 單例是一種類,該類只能例項化乙個物件。儘管這是單例的實際定義,但在fou...