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

本文介绍了单例模式,它是创建型模式,能确保一个类只有单个对象被创建,可直接访问。其优点是减少内存开销、避免资源多重占用,缺点是无接口、不能继承且与单一职责原则冲突。还列举了iOS中的应用,并以项目登录模块为例说明其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://juejin.im/post/5cd16a8d6fb9a031fe3bdca3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值