在经典的24个设计模式中,有一部分是关于对创建行为的封装的,他们分别是原型模式、单例模式、生成器模式、简单工厂模式、工厂方法模式、抽象工厂模式。他们都是致力于把实例化对象的职责解耦出来,通过不同的形式封装达到不同的效果。我们从最简单的例子开始入手看看这几种模式的相似与不同。
通常,我们实例化一个对象最简单的就是通过new操作符直接创建,但如果该对象比较复杂,在创建的同时要进行许多初始化工作,例如游戏中创建一个NPC对象,在new一个NPC后,要把他添加到相应的场景中,还有要对他设置许多属性,还要根据他身上的装备来绑定各种部件。通常我们会写一个NPCFactory类,提供一个NPCFactory::CreateNPC()接口把这一连串创建NPC相关的流程封装起来。在设计模式中把这样的做法叫做简单工厂(Simple Factory)模式。简单工厂严格来说不算是一个完整的设计模式,但很多人却误以为这就是所谓的工厂模式。
还有一个与上面说的很相似的是生成器(Builder)模式,不同点在于生成器模式把创建过程分开几个步骤封装到类中。就像这样:
NPCFactory.Init(szResourcePath);
NPCFactory.AddToScene(nSceneID);
NPCFactory.SetProperty();
NPCFactory.Equit();
NPC* pNpcA = NPCFactory.GetObject();
生成器模式的最大特点是分步骤,他把创建的过程封装成好几个步骤并交由使用者控制,使用者可以更灵活的控制创建,但相对应他的问题也是使用者必须熟悉创建流程与规则,要知道先Init、再设置、最后调GetObject才真正得到对象。
在介绍完简单工厂与生成器模式后,我们接着来看看另外两个很相似的工厂模式。工厂方法(Factory Method)模式与抽象工厂(Abstract Factory)模式。