单例模式(Singleton Pattern)是属于属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
单例模式大家在iOS中用的比较多了,见的也比较多了,比如Cocoa Touch 框架中使用的单例 1. UIApplication 2:NSFileManager,下面我觉的在项目中登录模块用到的单例举例。
SSJLoginModel.h 登录模型
@interface SSJLoginModel : NSObject
@property (readwrite, nonatomic, copy) NSString *phone;
@property (readwrite, nonatomic, copy) NSString *password;
@end
复制代码
SSJLoginModel.m 登录模型
@interface SSJLoginModel ()<NSSecureCoding>
@end
@implementation SSJLoginModel
+ (BOOL)supportsSecureCoding {
return YES;
}
#pragma mark - NSSecureCoding
- (instancetype)initWithCoder:(NSCoder *)decoder {
if (!self) {
return nil;
}
self.phone = [decoder decodeObjectForKey:NSStringFromSelector(@selector(phone))];
self.password = [decoder decodeObjectForKey:NSStringFromSelector(@selector(password))];
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.phone forKey:NSStringFromSelector(@selector(phone))];
[coder encodeObject:self.password forKey:NSStringFromSelector(@selector(password))];
}
@end
复制代码
SSJLoginManager.m 登录管理类
@interface SSJLoginManager : NSObject
+ (instancetype)sharedManager;
@property (readwrite, nonatomic, strong) SSJLoginModel *currentModel;
@end
复制代码
SSJLoginManager.m 登录管理类
@interface SSJLoginManager ()
@property (readwrite, nonatomic, copy) NSString *filepath;
@end
@implementation SSJLoginManager
+ (instancetype)sharedManager
{
static SSJLoginManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *filepath = @"自定义路径";
manager = [[SSJLoginManager alloc] initWithPath:filepath];
});
return manager;
}
- (instancetype)initWithPath:(NSString *)filepath {
if (self = [super init]){
_filepath = filepath;
[self writeData];
}
return self;
}
- (void)setCurrentModel:(SSJLoginModel *)currentModel {
_currentModel = currentModel;
[self saveData];
}
- (void)writeData {
NSString *filepath = [self filepath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filepath]) {
id object = [NSKeyedUnarchiver unarchiveObjectWithFile:filepath];
_currentModel = [object isKindOfClass:[SSJLoginModel class]] ? object : nil;
}
}
- (void)saveData {
NSData *data = [NSData data];
if (_currentModel) {
data = [NSKeyedArchiver archivedDataWithRootObject:_currentModel];
}
[data writeToFile:[self filepath] atomically:YES];
}
@end
复制代码
优秀之处:
所有的实现细节都包括在.m文件中,调用者只需要操作currentModel就可以实现数据的本地化