1.简述项目中常用的设计模式,它们都有什么优缺点?
单例模式 (Singleton Pattern)
核心概念
- 本质 :通过静态化实例 + 私有构造函数 确保类全局唯一实例。
- 线程安全 :Swift中
static let
底层通过dispatch_once
实现原子性初始化(iOS 10+废弃显式dispatch_once
)。
Swift
class NetworkManager {
static let shared: NetworkManager = {
let instance = NetworkManager()
instance.setup() // 初始化配置
return instance
}()
private init() {} // 禁止外部初始化
func setup() {
// 初始化网络配置
}
}
// 使用
NetworkManager.shared.request(...)
Swift特性
- 线程安全 :
static let
底层使用dispatch_once
保证原子性初始化 - 内存管理:单例对象在App生命周期内常驻内存
- 防止子类化 :通过
final
关键字或私有构造器限制继承
Objective-C实现
OC
// NetworkManager.h
@interface NetworkManager : NSObject
+ (instancetype)sharedInstance;
@end
// NetworkManager.m
@implementation NetworkManager
+ (instancetype)sharedInstance {
static NetworkManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] initPrivate];
});
return instance;
}
- (instancetype)initPrivate {
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (instancetype)init {
@throw [NSException exceptionWithName:@"SingletonException"
reason:@"Use +sharedInstance instead"
userInfo:nil];
}
@end
// 使用
[[NetworkManager sharedInstance] request...];
Objective-C特性
- 防御多次初始化 :通过
dispatch_once
保证唯一性 - 禁止直接初始化 :重写
init
方法抛出异常 - MRC兼容性:若项目未启用ARC,需手动管理内存
两种语言对比
维度 | Swift | Objective-C |
---|---|---|
线程安全 | 自动通过static let 保证 |
需手动用dispatch_once |
内存管理 | ARC自动管理 | 需注意MRC下的retain/release |
继承控制 | private init() 阻止子类化 |
通过initPrivate 限制初始化 |
代码简洁性 | 更简洁(现代语法) | 需更多模板代码 |
总结
单例: 它是用来限制一个类只能创建一个对象。这个对象中的属性可以存储全局共享的数据。所有的类都能访问、设置此单例中的属性数据。
优点: 是它只会创建一个对象容易供外界访问,节约性能。
缺点: 一个类只有一个对象,可能造成责任过重,在一定程度上违背了"单一职责原则"。单例模式中没有抽象层所以单例类的扩展有很大的困难。不能过多创建单例,因为单例从创建到程序关闭前会一直存在,过多的单例会影响性能,浪费系统资源。