有一段时间没有发博客了, 恰好如今忙完项目的需求, 如今能够闲下来写写简书, 顺便本身给本身复习巩固一下知识, 不过我在这里又要吐槽一句, 项目中遇到了一个单例的问题, 让我感到很是的蛋疼, 写这个单例的人只是单纯了为了写单例而写单例, 没有想到会发生什么, 如今让咱们一块儿来看看什么叫单例吧.git
最后:
若是你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会参考大家的意见再进行修改, 联系我时, 请备注单例模式
若是以为好的话, 但愿你们也能够打赏一下~嘻嘻~祝你们学习愉快~谢谢~github
Cain(罗家辉)
联系方式: zhebushimengfei@qq.com
腾讯QQ: 350116542objective-c
这是一张单例的
UML
图, 很是简单明了的讲解单例类究竟是怎么回事, 一般单例是用来做为管理中心, 或者是通知中心, 好比在iOS
当中的NSNotificationCenter
,[[UIApplication sharedApplication] statusBarStyle]
,NSUserDefaults
,[NSFileManager defaultManager]
等等都是单例, 单例类有几个特征.学习
- 系统当中只有一个实例
- 易于外界访问
- 防止子类继承
- 共享信息
首先, 咱们先来建一个
WorkSpace
, 这样子方便咱们之后多添加工程, 由于单例模式只是咱们的开始.spa
建立完
WorkingSpace
以后, 咱们就来添加SingletonPattern(单例)
的工程code
如今咱们来建立一个叫
UserInfoManager
单例类继承
声明一个类方法用于外界访问内存
#import <Foundation/Foundation.h> @interface UserInfoManagerCenter : NSObject + (instancetype)managerCenter; @end
接下来咱们去实现这个类方法就行了博客
#import "UserInfoManagerCenter.h" static UserInfoManagerCenter *managerCenter = nil; @implementation UserInfoManagerCenter + (instancetype)managerCenter { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ managerCenter = [[UserInfoManagerCenter alloc] init]; }); return managerCenter; }
看起来, 咱们好像搞定了整个单例模式了, 下面让咱们来试试效果.it
#import "ViewController.h" #import "UserInfoManagerCenter.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UserInfoManagerCenter *infoManagerCenter = [UserInfoManagerCenter managerCenter]; UserInfoManagerCenter *managerCenter = [UserInfoManagerCenter managerCenter]; NSLog(@"%@", infoManagerCenter); NSLog(@"%@", managerCenter); } @end
打印出来的效果好像是只有一个, 但实际上并非的, 咱们再来看看
#import "ViewController.h" #import "UserInfoManagerCenter.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UserInfoManagerCenter *infoManagerCenter = [UserInfoManagerCenter managerCenter]; UserInfoManagerCenter *managerCenter = [UserInfoManagerCenter managerCenter]; UserInfoManagerCenter *userInfoManagerCenter = [[UserInfoManagerCenter alloc] init]; NSLog(@"%@", infoManagerCenter); NSLog(@"%@", managerCenter); NSLog(@"%@", userInfoManagerCenter); } @end
发现这个类仍是能够初始化的, 而且是另外开辟了内存空间来存储的, 这就很尴尬了, 说好的只有一个实例呢???
我在这里说一句, 施主莫怕, 等贫僧跳大, 继续回到单例类当中, 添加几个判断就行了
#import "UserInfoManagerCenter.h" static UserInfoManagerCenter *managerCenter = nil; @implementation UserInfoManagerCenter + (instancetype)managerCenter { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ managerCenter = (UserInfoManagerCenter *)@"UserInfoManagerCenter"; managerCenter = [[UserInfoManagerCenter alloc] init]; }); NSString *classString = NSStringFromClass([self class]); if ([classString isEqualToString:@"UserInfoManagerCenter"] == NO) { NSParameterAssert(nil); } return managerCenter; } - (instancetype)init { NSString *userInfomanagerCenter = (NSString *)managerCenter; if ([userInfomanagerCenter isKindOfClass:[NSString class]] && [userInfomanagerCenter isEqualToString:@"UserInfoManagerCenter"]) { if (self = [super init]) { // 这里直接什么都不作操做 } return self; } return nil; } @end
口说无凭, 咱们来看看运行效果
这下子, 能够说明是只有一个实例了吧, 下面再来看看子类是否能继承
#import "ViewController.h" #import "UserInfoManagerCenter.h" #import "SubUserInfoManagerCenter.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UserInfoManagerCenter *infoManagerCenter = [UserInfoManagerCenter managerCenter]; UserInfoManagerCenter *managerCenter = [UserInfoManagerCenter managerCenter]; UserInfoManagerCenter *userInfoManagerCenter = [[UserInfoManagerCenter alloc] init]; SubUserInfoManagerCenter *subUserInfoManagerCenter = [SubUserInfoManagerCenter managerCenter]; NSLog(@"%@", infoManagerCenter); NSLog(@"%@", managerCenter); NSLog(@"%@", userInfoManagerCenter); NSLog(@"%@", subUserInfoManagerCenter); } @end
好了, 如今单例所需的
- 易于外界访问
- 系统当中只有一个实例
- 防止子类继承
咱们都搞定, 酱紫咱们就完成了一个单例类的建立啦
工程地址: https://github.com/CainRun/DesignPattern/tree/master/SingletonPattern