原型模式:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象。
在iOS中原型模式本质是使用了对象的复制机制。遵守NSCopying协议,实现copywithzone方法实现对象的深复制。
撤销重做等业务场景,常常和备忘录模式结合使用。
有三个绘图时需要的模型对象,stroke
、vertex
和point
,其中stroke
可以是vertex
和point
的组合,vertex
是point
的超类。三者均遵守 Mark
协议。
为了实现原型模式,我们在Mark
接口中声明-(id)copy
方法,所有协议的实现类中实现-(id)copyWithZone:(NSZone *)zone;
方法即可完成原型模式。需要时直接调用上述三个类的copy
方法即可。
工厂方法要点在于不是直接创建对象,而是使用类或者对象的工厂方法创建具体产品(对象),并以抽象类返回。
也称为虚构造器(virtual constructor)
工厂方法模式 : 定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
一个类无法预期需要生成哪个类的对象,想让其子类来指定所生成的对象。
有画布类CanvasView
,我们增加需求,要求画布背景可由用户选择,目前有纸质背景PaperCanvasView
和布质背景ClothCanvasView
。
在CanvasViewconstroller
中返回默认无图案画布,在需要时调用方法加载有特殊图案的画布。
抽象工厂: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
创建对象而不让客户端知晓返回了什么确切的具体对象。
NSNumber
是个抽象工厂,而NSCFBoolean
与NSCFNumber
是工厂。注意有类族(Class Cluster)的使用。生成器模式: 将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。
涉及具有各种特征的角色的游戏,应该好好使用这一模式,不是定义单独的Director去构建游戏者与敌人,而是把角色构建算法放在一个具体CharacterBuilder中,设计会好很多。
游戏中有两种角色,跑步者和敌人,此时用生成器模式构建会更好。
单例模式: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
UIApplication、NSFileManger等。
适配器模式: 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
有类适配器和对象适配器两种方式。
颜色面板多滑动条调节功能,用命令模式和适配器模式结合使用。
**桥接模式:**将抽象部分与它的实现部分分离,使它们都可以独立地变化。
虚拟仿真器。
外观模式: 为系统中的一组接口提供统一的接口。外观定义一个高层接口,让子系统更易使用。
打车时不关心车品牌、车牌号和车辆驾驶,而自己开车有启动、挂挡和刹车等步骤。
中介者模式: 用一个对象来封装一系列对象的交互方式。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式以中介者内部的复杂性代替交互的复杂性。因为中介者封装与合并了colleague的各种协作逻辑,自身可能变得比它们任何一个都复杂。这会让中介者自身成为无所不知的庞然大物,并且难以维护。
视图迁移。
观察者模式: 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
Cocoa中通知和KVO都是观察者模式的实现。
组合模式: 将对象组合成树形结构以表示”部分-整体“的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。
树形结构组织的每层用统一的接口,调用者不关心具体类型。
组合模式的主要意图是让树形结构中的每个节点具有相同的抽象接口。
迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
遍历树中节点。