
單例模式.jpg
在項(xiàng)目中我們經(jīng)常會(huì)用到單例類,覺得很方便,但是其弊端也很明顯:單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原則”。因?yàn)閱卫惣瘸洚?dāng)了工廠角色,提供了工廠方法,同時(shí)又充當(dāng)了產(chǎn)品角色,包含一些業(yè)務(wù)方法,將產(chǎn)品的創(chuàng)建和產(chǎn)品的本身的功能融合到一起。
如何寫一個(gè)安全的單例類呢?看聲明文件
#import <Foundation/Foundation.h>
@interface DanLi : NSObject<NSCopying,NSMutableCopying>
//單例類
+ (instancetype)sharedInstance;
@end
再看實(shí)現(xiàn)文件
#import "DanLi.h"
@implementation DanLi
static DanLi *instance = nil;
+ (instancetype)sharedInstance {
return [[self alloc]init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
if(!instance){
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
}
return instance;
}
- (id)copyWithZone:(struct _NSZone *)zone {
return [DanLi sharedInstance];
}
-(instancetype)mutableCopyWithZone:(NSZone *)zone{
return [DanLi sharedInstance];
}
//new方法不需要重寫
- (DanLi *)init {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if(!instance){
instance = [super init];
}
return instance;
}
@end