單例模式.jpg
在項(xiàng)目中我們經(jīng)常會(huì)用到單例類(lèi),覺(jué)得很方便,但是其弊端也很明顯:單例類(lèi)的職責(zé)過(guò)重,在一定程度上違背了“單一職責(zé)原則”熬苍。因?yàn)閱卫?lèi)既充當(dāng)了工廠角色袁翁,提供了工廠方法,同時(shí)又充當(dāng)了產(chǎn)品角色粱胜,包含一些業(yè)務(wù)方法,將產(chǎn)品的創(chuàng)建和產(chǎn)品的本身的功能融合到一起狐树。
如何寫(xiě)一個(gè)安全的單例類(lèi)呢?看聲明文件
#import <Foundation/Foundation.h>
@interface DanLi : NSObject<NSCopying,NSMutableCopying>
//單例類(lèi)
+ (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方法不需要重寫(xiě)
- (DanLi *)init {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if(!instance){
instance = [super init];
}
return instance;
}
@end