单例模式(Singleton)
1.单例模式是一个类在系统中只有一个实例对象(开始用shared命名),通过全局的一个入口点对这个实例对象进行访问。
2.单例模式是GOF设计模式中创建模式的一种,它的应用非常广泛,有些对象在整个应用程序中只需要唯一一个,此时就可以将其设计为单例模式,否则创建对象可能导致对象状态混论或者内存耗费严重等问题。
3.单例实现步骤
单例类:一个类只能创建一个对象
1.废掉初始化方法,不允许外界调用原来的初始化方法穿件对象
2.使用私有化的初始化方法
3.提供一个类方法向外界返回该类的唯一实例
#import <Foundation/Foundation.h>
@interface LXKSingleton : NSObject {
NSInteger value;
}
/**返回该类的实例化的类方法*/
+ (instancetype) sharedInstace;
- (NSInteger) value;
@end
#import "LXKSingleton.h"
@implementation LXKSingleton
- (instancetype)init
{
// 1.抛出异常方式
@throw [NSException exceptionWithName:@"DataBaseManager init" reason:@"不能通过此方法初始化" userInfo:nil];
// 2.断言 判定言论 直接使程序崩溃
// NSAssert(NO, @"DataBaseManager不能调用此方法");
return self;
}
// 初始化方法没有在.h文件中暴露接口相当于一个私有的初始化方法
- (instancetype)initPrivate
{
if (self = [super init]) {
value = arc4random();
}
return self;
}
+ (instancetype) sharedInstace
{
// 一定要加静态static的指针,始终只有一个对象,并且很早以前就已经创建好了 static类型的变量拥有全局的生命周期
static LXKSingleton *instance = nil;
static dispatch_once_t onceToken;
// 1.一个C的函数方式
dispatch_once(&onceToken, ^{
if (!instance) {
instance = [[self alloc] initPrivate];
}
});
// 2.合成 同步保护(只有允许一个线程进入下面的代码块行 如果有多个线程 其它线程需要排队等待之前进入的线程离开同步快以后才能进入同步块 这样即使在多线程环境下也能保证该类只能创建出一个对象)
// @synchronized(self) {
// if (!instance) {
// instance = [[LXKSingleton alloc] initPrivate];
// }
// }
return instance;
}
- (NSInteger) value
{
return value;
}
@end