设计模式分为三种类型,共23种:
- 创建型模式: 单例、抽象工厂、建造者、工厂、原型
- 结构型模式:适配器、桥接、装饰、组合、外观、享元、代理
- 行为型模式: 模板方法、命令、迭代器、观察者、中介、备忘录、解释器、状态、策略、职责链、访问者模式。
MVC
Model-View-Controller,以Model作为数据工厂,放入数据对象。Controller作为桥梁,处理业务,而View只是数据展示层,理论上应该与业务无关,MVC降低了耦合性,提供了重用性和适用性,可有效的提高哦开发效率。
MVVM把原来在Controller的业务逻辑、网络请求、数据存储等操作和表现逻辑,分离到ViewModel中,从而使ViewController得到精简。
MVC中,Controller同时控制Model和View,MVVM中,ViewModel作为一个过渡,Model的数据获取和加工由ViewModel负责,得到合适View的数据,利用绑定机制,使得View得以自动更新。
单例模式
单例模式:它可以保证某个类创建出来的对象永远只有1个。类的一个对象成为系统中的唯一实例。一个类仅有一个实例,并提供一个访问它的全局访问点。
定义包含三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须向整个系统提供这个实例。
何时使用单例
- 类只能有一个实例。作用:节省内存资源
- 这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。
单例模式的实现
在Objective-C中实现单例模式,需要完成如下四个步骤:
第一步:定义一个静态实例变量mySingleton(名字可以自己取),初始化为nil,代码如下所示:
static MySingleton *mySingleton = nil;
第二步:实现一个类方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,代码如下所示:
1 | + (id)sharedInstance |
dispatch_once函数是GCD中的API,它保证应用程序即使在多线程环境下,也只执行一次。当然,也可以使用@synchronize来达到线程安全的目的,如下:
1 | + (id)sharedInstance |
第三步:重写allocWithZone方法,用来保证使用alloc和init试图获得一个新实例的时候不产生新实例,代码如下所示:
1 | + (id)allocWithZone:(NSZone *)zone |
第四步:适当实现copyWithZone,release和autorelease等方法。代码如下所示:
1 | // 如果有其他初始化操作,可在这里进行初始化 |
子类化Singleton
【补充】说明,对于第二步和第三步可以这样实现:
1 | + (id)sharedInstance |
alloc调用被转发给super,意味着NSObject晖处理对象分配,如果不做修改的子类化Singleton,返回的实例总是Single。因为Singleton重载了所以实例化相关的方法,实现如下:
1 | @implementation SingletonSon |
- 单例模式实现代码:(MRC)
static MJSoundTool *_soundTool = nil;
若是ARC:
在build加标记-fobjc-arc
与MRC类似,只是没有了release,retain。
在宏中用if__has_feature(objc_arc)
判断
创建单例设计模式的基本步骤:- 声明一个单件对象的静态实例,并初始化为nil。
- 创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例
- 实现NScopying协议, 覆盖allocWithZone:方法,确保用户在直接分配和初始化对象时,不会产 生另一个对象。
@interface MJSoundTool : NSObject<NSCopying>
- 覆盖release、autorelease、retain、retainCount方法, 以此确保单例的状态。
- 在多线程的环境中,注意使用@synchronized关键字或GCD,确保静态实例被正确的创建和初始化。
单例模式在IOS中的应用
单例模式在IOS中的应用非常广泛,如 UIApplication、NSUserDefault
[NSNotificationCenter defaultCenter]、
[UIApplication sharedApplication]、
[NSFileManager defaultManager]
[UIAccelerometer sharedAccelerometer]接收来自单例实例的加速度数据等。
用在登录界面和一些第三方框架的二次封装等
观察者
KVO和NSNotification。KVO是被观察者主动向观察者发送消息。NOtification是被观察者想NotificationCenter发送消息,再由NotificationCenter post通知到每个注册的观察者。
代理
通知
KVC。KVO
工厂模式
自定义VIew用到。