单例
什么情况下会需要单例呢?比如系统中只能共享而不能复制的资源。例如,GPS,CoreLocation框架中的类
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
何时使用单例
1.类只能有一个实例,并且必须有一个为人熟知的访问点对其访问,比如工厂方法。
2.唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端的代码。
Coco Touch框架中使用单例模式
UIApplication类
NSFileManager
抽象工厂模式
同一样披萨,配料的特点却因风味而略有不同。
抽象工厂提供一个固定的接口,用于创建一系列有关联或者相依存的对象而不指定具体的类或者创建的细节。客户端与从工厂得到的具体对象之间没有耦合。
抽象工厂:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们的具体类
Coco Touch框架中使用抽象工厂
NsNumber
创建NSNumber实例的方式完全符合抽象工厂模式。
- (NSNumber *)initWithFloat:(float)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithDouble:(double)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithBool:(BOOL)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithInteger:(NSInteger)value
工厂方法模式
工厂方法也成为虚拟构造器。它适用于这种情况:一个类无法预期需要生成哪个类的对象,而让其子类来指定所生成的对象。
简单来说:你让工厂给你生产商品。你给它们发送一些“生产产品”的消息。工厂按照“生产产品”的协议启动生产线。过程结束后,每个厂家都返回所生产的特定类型的产品。我们把“生产”这个成为工厂方法。
工厂方法模式:定义创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到其子类。
何时使用工厂方法模式
1.编译时无法准确预期要创建对象的类
2.类想让其子类决定在运行时创建什么
3.类有若干辅助类为其子类,而你想讲返回哪个子类的这一信息局部化
Coco Touch框架中使用工厂方法
如何创建NSNumber的具体子类型的实例对象的所有细节都由NSNumber的方法负责
抽象工厂与工厂方法.png
观察者模式
观察者模式也叫做发布-订阅模式。它很像杂志的订阅。订从杂志发行商订阅的时候,读者把名字和地址发送给发行商,这样新的一期就能送到读者手上。这正是观察者模式的工作方式。观察者通过通知器(发行商)把自己注册到(订阅)特定的通知(杂志)。当有通知的时候,观察者只从通知器得到他订阅的通知。
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
何时使用观察者模式
1.有两种抽象类型相互依赖。将它们封装在各自的对象中就可以对它们单独进行改变和复用。
2.对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
3.一个对象必须通知其他对象,而它又不需要知道其他对象是什么。
举例
KVO
NSNotification
NSNotificationCenter
适配器模式
用于连接两种不同种类的对象,使其毫无问题地协同工作。有时也被称为“包装器”
实现方式
1.通过继承来适配两个接口,这称为类适配器。
2.对象适配器。与类适配器不同,对象适配器不继承适配着而是组合了一个对它的引用。
适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。
何时使用适配器模式
1.已有类的接口和需求不匹配
2.想要一个可复用的类,该类能够同可能带有不兼容接口的其他类协作。
3.需要适配一个类的几个不同子类,可是让每一个子类去子类化一个类适配器又不现实,那么可以使用对象适配器(也叫委托)来适配其父类的接口。
代理模式(委托模式)
代理模式和委托者模式的联系
适配器模式主要是将类的接口变为客户端要求的另一种接口。这里的客户端它们是Cocoa Touch框架中的类。
实现协议的类会是个适配器。
之所以委托模式主要是适配器模式,是因为委托机制也可以实现某些其他设计模式,比如说装饰模式。委托模式用于多个设计模式的混合体并与其相互关联的情况很常见
网友评论