iOS 设计模式
MVC
- Model: 模型
- View:视图
- Controller:控制器
单例
单例使用懒加载方式在第一次实例时创建,如[NSUserDefaults standardUserDefaults]
,[UIApplication sharedApplication]
, [UIScreen mainScreen]
,[NSFileManager defaultManager]
系统的单例类:
- UIApplication
- NSNotificationCenter
- NSFileManager
- NSUserDefaults
- NSURLCache
- NSHTTPCookieStorage
@interface LibraryAPI : NSObject
+ (LibraryAPI *)sharedInstance;
@end
+ (LibraryAPI *)sharedInstance
{
// 声明一个静态变量去保存类的实例,确保它在类中的全局可用
static LibraryAPI *_sharedInstance = nil;
// dispatch_once_t 确保初始化器只执行一次
static dispatch_once_t oncePredicate;
// 单例的关键,一旦类被初始化,初始化器不会再被调用
dispatch_once(&oncePredicate, ^{
_sharedInstance = [[LibraryAPI alloc] init];
});
return _sharedInstance;
}
@implementation XNShareTool
/**
步骤:
1.一个静态变量_instance
2.重写allocWithZone, 在里面用dispatch_once,并调用super allocWithZone
3.自定义一个sharedXX,用来获取单例。在里面也调用dispatch_once,实例化_instance
--------可选--------
4.如果要支持copy。则(先遵守NSCopying协议)重写 copyWithZone,直接返回 _instance 即可。
*/
/** 第1步:存储唯一实例 */
static XNShareTool *_instance;
/** 第2步:分配内存空间时会调用这个方法。保证分配内存 alloc 时都相同 */
+(id)allocWithZone:(struct _NSZone *)zone
{
// 调用 dispatch_once 保证在多线程中也只被实例化一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
/** 第3步:保证 init 初始化时都相同 */
+(instanceType)sharedTool
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[XNShareTool alloc] init];
});
return _instance;
}
/** 第4步:保证 copy 时都相同 */
-(id)copyWithZone:(NSZone *)zone
{
return _instance;
}
@end
门面模式 Facade
暴露接口
装饰器模式 Decorator
常见的实现是 Category 和 Delegation。
适配器模式 Adapter
包装一个对象暴露一个标准的接口。可以使用协议的方式实现,比如 UITableViewDelegate,UIScrollViewDelegate, NSCoding 和 NSCopying 协议。
观察者模式 Observer
Notifications 和 Key-Value Observing(KVO)。
备忘录模式 Memento
比如 NSUserDefaults,或者类似的方式进行状态保存使得再次进入时能够和离开时一样。可以使用 UIApplicationDidEnterBackgroundNotification 这个通知去保存状态。
命令模式
通过 Target_Action 机制和 Invocation 实现命令模式。