单例模式
来源:互联网 发布:linux 图形安装 kvm 编辑:程序博客网 时间:2024/04/30 19:29
单例模式是指系统中的一个类只有一个实例,并提供一个访问它的全局方法,常用的方法是将创建这个实例的操作隐藏在一个类操作中(即一个静态成员函数或者是一个类方法)
这个类可以保证没有其他实例可以被创建(通过截取创建对象的请求)
UML图
创建单例
方法一:
+ (instancetype)managerCenter { static UserInfoManagerCenter *center = nil; if (center == nil) { center = [[UserInfoManagerCenter alloc] init]; } return center;}缺点:如果多个地方同时调用这个函数,当同时进入这个函数的时候,center这个实例为空,会导致同时创建多个实例化类
方法二:
通过使用队列使请求不同时发生
+ (instancetype)managerCenter { static UserInfoManagerCenter *center = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ center = [[UserInfoManagerCenter alloc] init]; }); return center;}
编写更加严格的单例
1.防止其它的类调用创建单例的方法
2.防止通过调用init方法来创建类
+ (instancetype)managerCenter { static dispatch_once_t predicate; dispatch_once(&predicate, ^{ center = (UserInfoManagerCenter *)@"UserInfoManagerCenter"; center = [[UserInfoManagerCenter alloc] init]; }); // 防止子类使用 NSString *classString = NSStringFromClass([self class]); if ([classString isEqualToString:@"UserInfoManagerCenter"] == NO) { NSParameterAssert(nil); } return center;}- (instancetype)init { NSString *string = (NSString *)center; if ([string isKindOfClass:[NSString class]] == YES && [string isEqualToString:@"UserInfoManagerCenter"]) { self = [super init]; //通过调用[[UserInfoManagerCenter alloc] init]方法直接实例化变量返回nil if (self) { // 防止子类使用 NSString *classString = NSStringFromClass([self class]); if ([classString isEqualToString:@"UserInfoManagerCenter"] == NO) { NSParameterAssert(nil); } } return self; } else { return nil; }}
0 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- SVN常用命令
- C++ 顺序栈类实现
- python中的异常
- Devu, the Dumb Guy
- 多线程问题
- 单例模式
- Caffe傻瓜系列(3):激活层(Activiation Layers)及参数
- iOS如何将App程序发布到App Store?
- iOS中的label加载HTML文件
- linux网络编程
- [Android实例] 仿Win8磁铁效果,能够拖动改变Merto位置
- 使用Redis的Java客户端Jedis
- Keymob发力程序化交易 拥抱移动广告未来
- Java编程思想读书笔记(一)