iOS 中的 21 种设计模式

对象创建

原型(Prototype)

使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象。

array 就是原型了,array2 以 array 为原型,通过 copy 操作创建了 array2。

当创建的实例非常复杂且耗时,或者新实例和已存在的实例值相同,使用原型模式去复制已经存在的实例效率更高。

工厂方法(Factory Method)

定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得类的实例化延迟到其子类。

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂类来创建不同的产品实例。

1400498-777e0404b8cc8449

FactoryMethod.jpg

 

如上图,+ create():Product 就是工厂方法,ConcreatFactoryA 与 ConcreateFactoryB 就是两个工厂类,ConcreateProductA 与 ConcreateProductB 就是两个工厂类对应的产品类,通过不同的工厂生产不同类型的产品,且两个产品类最终返回的是他们的父类 Product,隐藏了对象的具体类型。工厂方法模式让创建的对象拥有一组共同的接口,使我们无需关心做了不同类型接口的具体实现,只需要调用 Product 的接口就行。
工厂方法模式的扩展性也很好,新增的产品类并不需要修改客户端代码。但每新加一个产品类都需要新建一个工厂类,会造成项目中的类过多。

而在 Cocoa Touch 框架中,以 NSNumber 举例,将原有的 alloc+init 拆开写:

发现 + alloc 后并非生成了我们期望的类实例,而是一个NSPlacehodlerNumber 的中间对象,后面的 – initWithXXXXX 消息都是发送给这个中间对象,再由它做工厂,生成真的对象。如 obj3 的实际类型为 NSCFBoolean,而 obj4 的实际类型为 NSCFNumber 。

抽象工厂(Abstract Factory)

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

1400498-d9f79833197efa28
AbstractFactory.jpg

 

如上图,抽象工厂有一个产品族的概念,Factory1 与 Factory2 是继承 AbstractFactory 的两个产品族工厂类, 继承了父类创建 A,B 两个产品的方法,不同产品族工厂类会创建不同类型的产品,最终返回了不同的产品族对象,既 ProductA 和 ProductB。

在 Cocoa Touch 框架中,类簇是抽象工厂模式在 iOS 下的一种实现,以 NSArray 举例,将原有的 alloc+init 拆开写:

发现 + alloc 后并非生成了我们期望的类实例,而是一个NSPlacehodlerArray 的中间对象,后面的 – init 或 – initWithXXXXX 消息都是发送给这个中间对象,再由它做工厂,生成真的对象。这里的 NSArrayI 和 __NSArrayM 分别对应 Immutable 和 Mutable(后面的 I 和 M 的意思)

于是顺着思路猜实现,__NSPlacehodlerArray 必定用某种方式存储了它是由谁 alloc 出来的这个信息,才能在 init 的时候知道要创建的是可变数组还是不可变数组。

抽象工厂将一系列的产品族统一到一起创建,增加产品族很方便,但增加产品很麻烦,需要改动太多的类的接口。

生成器(Builder)

将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。
生成器可以将构建对象的过程分为,客户 – 指导者 – 生成器 的关系,

characterBuilder 就是生成器了,而 game 就是指导者。指导者里声明了创建不同表现的对象的方法。而方法里由生成器 characterBuilder 来构建不同的 Character 类型的对象。

生成器模式将复杂的生成对象的过程交给了生成器去完成,作为客户的我们只需要根据简单的接口去生成不同表现的对象。如上述代码中的 player 以及 enemy。玩家和敌人具体的属性数值我们不需要去设置,而是交给生成器去设置。

单例(Singleton)

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

在 Cocoa Touch 框架中,最常见的使用了单例模式的就是 UIApplication 类了。每个应用程序有且仅有一个 UIApplication 的实例,它由 UIApplicationMain 函数在程序启动时创建为单例对象,之后,对同一 UIApplication 实例可以通过其 sharedApplication 类方法进行访问。

单例用来集中管理对类的对象所提供的资源,例如应用程序中需要用集中式的类来协调其服务,这个类就应该