單例模式(Singleton)
1.單例模式是一個(gè)類在系統(tǒng)中只有一個(gè)實(shí)例對象(開始用shared命名),通過全局的一個(gè)入口點(diǎn)對這個(gè)實(shí)例對象進(jìn)行訪問晕窑。
2.單例模式是GOF設(shè)計(jì)模式中創(chuàng)建模式的一種,它的應(yīng)用非常廣泛古劲,有些對象在整個(gè)應(yīng)用程序中只需要唯一一個(gè)肴敛,此時(shí)就可以將其設(shè)計(jì)為單例模式,否則創(chuàng)建對象可能導(dǎo)致對象狀態(tài)混論或者內(nèi)存耗費(fèi)嚴(yán)重等問題采够。
3.單例實(shí)現(xiàn)步驟
單例類:一個(gè)類只能創(chuàng)建一個(gè)對象
1.廢掉初始化方法肄方,不允許外界調(diào)用原來的初始化方法穿件對象
2.使用私有化的初始化方法
3.提供一個(gè)類方法向外界返回該類的唯一實(shí)例
#import <Foundation/Foundation.h>
@interface LXKSingleton : NSObject {
NSInteger value;
}
/**返回該類的實(shí)例化的類方法*/
+ (instancetype) sharedInstace;
- (NSInteger) value;
@end
#import "LXKSingleton.h"
@implementation LXKSingleton
- (instancetype)init
{
// 1.拋出異常方式
@throw [NSException exceptionWithName:@"DataBaseManager init" reason:@"不能通過此方法初始化" userInfo:nil];
// 2.斷言 判定言論 直接使程序崩潰
// NSAssert(NO, @"DataBaseManager不能調(diào)用此方法");
return self;
}
// 初始化方法沒有在.h文件中暴露接口相當(dāng)于一個(gè)私有的初始化方法
- (instancetype)initPrivate
{
if (self = [super init]) {
value = arc4random();
}
return self;
}
+ (instancetype) sharedInstace
{
// 一定要加靜態(tài)static的指針,始終只有一個(gè)對象,并且很早以前就已經(jīng)創(chuàng)建好了 static類型的變量擁有全局的生命周期
static LXKSingleton *instance = nil;
static dispatch_once_t onceToken;
// 1.一個(gè)C的函數(shù)方式
dispatch_once(&onceToken, ^{
if (!instance) {
instance = [[self alloc] initPrivate];
}
});
// 2.合成 同步保護(hù)(只有允許一個(gè)線程進(jìn)入下面的代碼塊行 如果有多個(gè)線程 其它線程需要排隊(duì)等待之前進(jìn)入的線程離開同步快以后才能進(jìn)入同步塊 這樣即使在多線程環(huán)境下也能保證該類只能創(chuàng)建出一個(gè)對象)
// @synchronized(self) {
// if (!instance) {
// instance = [[LXKSingleton alloc] initPrivate];
// }
// }
return instance;
}
- (NSInteger) value
{
return value;
}
@end