iOS几种设计模式

代理模式

应用场景:当一个类的某些功能需要有别的类来实现,但是又不确定具体回事哪一个类实现。
优势:解耦合
敏捷原则:开放-封闭原则
实例:tableview的数据源delegate,通过和protocol的配合,完成委托诉求。

观察者模式

应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。
优势:解耦合
敏捷原则:接口隔离原则,开放-封闭原则
实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。

MVC模式

应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。
优势:使系统,层次清晰,职责分明,易于维护
敏捷原则:对扩展开放-对修改封闭
实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。

单例模式

什么是单例:

  • 单例其实就是C语言中的全局变量
  • 在整个程序的生命周期中单例只有一份内存
  • 可以在多个程序中数据共享
应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。
优势:使用简单,延时求值,易于跨模块
敏捷原则:单一职责原则
实例:[UIApplication sharedApplication]。
object- c中,重写allocWithZone方法,保证即使用户用 alloc方法直接创建单例类的实例,
返回的也只是此单例类的唯一静态变量。

    Manager *manger = [Manager shareManger];

Manager *manger2 = [Manager shareManger];

NSLog(@”%p—–%p”,manger,manger2);//指向同一块地址

单例的几种写法

/*经典写法,多线程调用单例时,会出现多次实例化,数据不会很准确

+(Manager *)shareManger

{

if (manger == nil) {

manger = [[[self class] alloc] init];

}

return manger;

}

*/

/*防止多线程调用,为线程加锁

+(Manager *)shareManger

{

@synchronized(self) {//线程加锁,排队执行

if(manger == nil){

manger = [[[self class]alloc] init];

}

}

return manger;

}

*/

+(Manager *)shareManger

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{//直接用gcd的一个子线程让block里面的只会执行一次

if(manger == nil){

manger = [[[self class]alloc] init];

}

});

return manger;

}

分享到: 更多