设计模式项目实战(单例模式写好一个登录管理类)

328 阅读2分钟

单例模式(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就可以实现数据的本地化