有些任务只能有一个实例,比如打印任务,比如一些资源管理器
UML图
一、使用步骤
1.写法一
(1)防止子类继承
(2)确保实例对象只出现一个
staticSLManager *center;
@implementation SLManager
+ (instancetype)defaultManager {
//只创建一个实例
staticdispatch_once_t predicate;
dispatch_once(&predicate, ^{
center = (SLManager *)@"SLManager";
center = [[SLManageralloc]init];
});
//防止子类使用
NSString *classString = NSStringFromClass([selfclass]);
if ([classString isEqualToString:@"SLManager"] == NO) {
NSParameterAssert(nil);
}
returncenter;
}
- (instancetype)init
{
NSString *string = (NSString *)center;
if ([string isKindOfClass:[NSStringclass]] == YES && [string isEqualToString:@"SLManager"]) {
self = [superinit];
if (self) {
//防止子类使用
NSString *classString = NSStringFromClass([selfclass]);
if ([classString isEqualToString:@"SLManager"] == NO) {
NSParameterAssert(nil);
}
}
returnself;
}
returnnil;
}
*(3)防止实例被释放掉
2.写法二
(1)确保实例对象只出现一个
+ (instancetype)defaultManager {
@synchronized(self) {
if (center == nil) {
center = [[SLManageralloc]init];
}
}
returncenter;
}
+ (instancetype)allocWithZone:(struct_NSZone *)zone {
@synchronized(self) {
if (center == nil) {
center = [superallocWithZone:zone];
returncenter;
}
}
returnnil;
}
+ (id)copyWithZone:(NSZone *)zone {
returnself;
}
- (instancetype)init
{
@synchronized(self) {
self = [superinit];
if (self) {
}
returnself;
}
}
二、基本属性
三、代码示例
1.实现单例模式的两种方法
https://github.com/shileseal/SLSingletonPatternDemo
2.单例模式的应用
用单例设计存储数据的接口
用单例接口隔离实现的细节
在单例提供接口的基础上实现封装
https://github.com/shileseal/SLSingleton