工厂模式是创建型模式,它的作用是创建对象。具体来说,常见的工厂模式包括简单工厂模式,工厂方法模式和抽象工厂模式三种。
简单工厂模式(Simple Factory Pattern)

角色定义:
工厂类
工厂类通常包含一个静态方法(类方法),由该方法根据输入类型负责创建具体的产品(对象)。
抽象产品基类(接口)
它的作用是降低客户端和具体产品之间的耦合度。而且符合了开闭原则,以后需要加入新车型,客户端调用的代码也基本无需修改。
具体产品类
真正实现业务逻辑的子类。
解决的问题:
工厂模式的核心思想在于:
-
通过引入工厂类,使对象的创建和使用分离了。这样的好处是它们可以独立的变化,易维护和扩展。
-
客户端依赖抽象基类(接口),而不是具体的类,降低了耦合度。
适用的场景:
- 有一组相似的对象,需要集中统一创建时。
- 创建对象的过程较为复杂时。
- 对象很多,并且有扩展需求时。
- 客户端不需要知道创建对象的过程时。
- 客户端使用的对象存在变动的可能,或者根本不知道使用哪一个具体对象时。
工厂方法模式(Factory Method Pattern)
简单工厂方法有两个缺点:
- 工厂类只有一个,且静态的工厂方法无法由子类继承,所以工厂的扩展受到限制。
- 工厂方法里除了创建对象的代码,还有大量的判断逻辑(if-else)混在里面,方法会变得越来越臃肿。
角色定义:
抽象工厂类、具体工厂子类
工厂方法模式在简单工厂模式的基础上演变为抽象出一个工厂父类,然后用不同的工厂子类来生成各自的产品。

抽象工厂模式(Abstract Factory Pattern)
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类。抽象工厂模式里每个工厂都会生产多种产品,但不同工厂生产的产品属于不同的系列。抽象工厂模式可以用来解决多产品族的问题。
角色定义:
产品族:
产品族可以理解为产品系列。举个例子,现代简约风格的家具,包括桌子沙发茶几是一个产品系列;中式古典风格的桌子沙发茶几是另一个产品系列。抽象工厂模式就是用不同的工厂来生产不同系列下的一组产品。
再举个该模式常被应用的例子:App修改主题(换肤)。App界面是由各种UI控件组成的,每个主题下同样的控件会有不同的样式。不同主题的工厂会生产各自样式的控件。变换主题时只要加载需要的主题工厂就可以了。

解决的问题:
- 将一个系列的产品族统一到一起创建。
- 容易改变产品的系列。
适用的场景:
- 需要创建一组对象,并需要切换不同的系列时。
缺点:
- 增加新的产品种类困难,它需要修改抽象工厂的接口。
- 代码结构比较复杂。
iOS中的工厂模式
工厂模式是一种常用的设计模式。在Cocoa Touch框架中,NSNumber可以看做是一个工厂模式的变种,它提现了工厂模式的设计思想。它统一了基础数据类型对象的创建。

NSPlaceholderNumber的中间对象,给该对象发送init方法,才生成真正的对象。obj3的实际类型为NSCFBoolean,obj4的实际类型为NSCFNumber。这其中NSNumber即可以看做是工厂类,也是抽象产品基类,而具体产品子类则是NSCFBoolean和NSCFNumber。