注意单件模式在多线程的问题。
Abstract Factory抽象工厂:
例子:游戏中不同系列的设施创建(古典的,现代的...),但是对于系列中的对象(道路,房屋...这些是不变的,不
会需要增加一个“下水道”对象)简单工厂的问题:--不能应对“不同系列对象”的变化,有了新的变化点。一系列相互依赖的对象
抽象工厂的缺点:难以应对“新对象”的需求变动,它只适用于“新系列”的需求变动。Abstract Factory模式和Factory Method模式结合,来应对“对象创建”的需求变化
Builder生成:
例子:游戏中造房子,房子的各个部分千变万化,这样就可以造出各种各样的房子。
“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的
各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。
意图:将一个复杂对象的构建与其表示相分离,使得同样的构建过程 可以创建 不同 的表示。
Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动,其缺点在于难以应付“构建算法”的频繁需求
变动。
Builder模式通常和Composite模式组合使用。
Factory Method工厂方法:
例子:造车,比如要造红旗车,但是现在需求变了,需要造东风车。
“某个对象”的创建工作,由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使得一个类的实例化延迟到子类
Prototype原型:
例子:一个游戏中需要多个Actor,这具体某个Actor可能会用到多个,所以采用“克隆”,来创建多个具体的
Actor。
“某些结构复杂的对象”的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳
定一致的接口。使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
创建型模式总结:
Singleton解决的是实体对象个数的问题,除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系
。
工厂方法模式(Factory Pattern)的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中去
,强调的是“单个对象”的变化。
抽象工厂模式(Abstract Factory)抽象工厂是所有工厂模式中最为抽象和最具有一般性的一种形态。抽象工厂可以向客户提供一个接口,使得客户可以在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象,强调的是“系列对象”的变化。
生成器模式(Builder Pattern)把构造对象实例的逻辑移到了类的外部,在这个类的外部定义了这个类的构造逻
辑。他把一个复杂对象的构造过程从对象的表示中分离出来。其直接效果是将一个复杂的对象简化为一个比较简单
的目标对象。他强调的是产品的构造过程。
原型模式(Prototype Pattern)和工厂模式一样,同样对客户隐藏了对象创建工作,但是,与通过对一个类进行
实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。
Factory Method,Abstract Factory,Builder都需要一个额外的工厂类来负责实例化“易变对象”,而
Prototype则是通过原型(一个特殊的工厂类)来克隆“易变对象”。
如何选择使用创建型模式
考虑游戏开发场景,假定在这个游戏场景中我们使用到的有墙(Wall),屋子(Room),门(Door)几个部件。在这个过程中,同样是对象的创建问题,但是会根据所要解决的问题不同而使用不同的创建型模式。
如果在游戏中,一个屋子只允许有一个门存在,那么这就是一个使用Signleton模式的例子,确保只有一个Door类
的实例被创建。解决的是对象创建个数的问题。
在游戏中需要创建墙,屋子的实例时,为了避免直接对构造器的调用而实例化类,这时就是工厂方法模式了,每一
个部件都有它自己的工厂类。解决的是“单个对象”的需求变化问题。
在游戏场景中,不可能只有一种墙或屋子,有可能有现代风格(Modern),古典风格(Classical)等多系列风格
的部件。这时就是一系列对象的创建问题了,是一个抽象工厂的例子。解决的是“系列对象”的需求变化问题。
如果在游戏场景中,构成某一个场景的算法比较稳定,例如:这个场景就是用四堵墙,一个屋子,一扇门来构成的
,但具体是用什么风格的墙、屋子和门则是不停的变化的,这就是一个生成器模式的例子。解决的是“对象部分”
的需求变化问题。
如果在游戏中,需要大量的古典风格或现代风格的墙或屋子,这时可以通过拷贝一个已有的原型对象来生成新对象
,就是一个原型模式的例子了。通过克隆来解决“易变对象”的创建问题。
如果遇到“易变类”,起初的设计通常从Factory Method开始,当遇到更多的复杂变化时,可以考虑重构为其他三
种工厂模式。