Skip to content

Latest commit

 

History

History
163 lines (47 loc) · 3.23 KB

单例模式.md

File metadata and controls

163 lines (47 loc) · 3.23 KB

单例模式

单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,并提供一个访问它的全剧访问点。

UML

适用场景

系统只需要一个实例对象,客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例

作用

  • 在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在APP开发中我们可能在任何地方都要使用用户的信息,那么可以在登录的时候就把用户信息存放在一个文件里面,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理

  • 有的情况下,某个类可能只能有一个实例。比如说你写了一个类用来播放音乐,那么不管任何时候只能有一个该类的实例来播放声音。再比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印任务同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例

创建单例 创建一个单例需要注意

  • 1、多线程中保证单例对象唯一
  • 2、new、copy、alloc的时候保证单例唯一
+ (instancetype)sharedInstance
{
static UserInfoManagerCenter *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[super allocWithZone:NULL] init] ;
}) ;
return sharedInstance ;
}

+ (id)allocWithZone:(struct _NSZone *)zone
{
return [UserInfoManagerCenter sharedInstance] ;
}

- (id)copyWithZone:(struct _NSZone *)zone
{
return [UserInfoManagerCenter sharedInstance];
}

- (id)mutableCopyWithZone:(NSZone *)zone
{
return [UserInfoManagerCenter sharedInstance];
}

我们在调用的时候打印

UserInfoManagerCenter *manager = [[UserInfoManagerCenter alloc]init];
UserInfoManagerCenter *manager1 = [UserInfoManagerCenter sharedInstance];
UserInfoManagerCenter *manager2 = [manager copy];
UserInfoManagerCenter *manager3 = [manager mutableCopy];
NSLog(@"\n%@\n%@\n%@\n%@\n",manager,manager1,manager2,manager3);

单例

  • sharedInstance方法是向外部提供的获取唯一的实例对象的方法,也是该类中的其他可以创建对象的方法的都调用的方法。在这个方法内部使用了dispatch_once函数来避免多线程访问导致创建多个实例的情况。
  • 为了在alloc init出初始化方法可以返回同一个实例对象,在allocWithZone:方法里面仍然调用了sharedInstance方法。 而且为了在copymutableCopy方法也可以返回同一个实例对象,在copyWithZone:mutableCopyWithZone也是调用了sharedInstance方法。