iOS 设计模式 - 单例模式

来源:互联网 发布:奶油知多少 编辑:程序博客网 时间:2024/05/18 23:14

有些任务只能有一个实例,比如打印任务,比如一些资源管理器

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

四、总结

2 0
原创粉丝点击