工厂方法
原文:http://www.vincehuston.org/dp/factory_method.html
定义:
定义产生对象的接口,而是让它的子类去决定应实例化哪个类。工厂方法让类的实例化转移到了子类中去。
定义一个"virtual"构造方法。
问题:
在一定范围内的应用程序中,一个框架就需要有一个标准化的模块来提供程序的实例化,除了允许个别的程序自己去定义属于他们的对象。
结构说明:
1、 使用策略模式来代替”New”操作,来构造对象。
2、 在XYZ基类中定义”MakeXYZ”方法,返回一个XYZ的抽象类型实例。
3、 每一个继承基类的类实现一个构造方法,并返回自己类型的实例。
讨论:
工厂方法创建对象如同模板方法实现一个运算法则。超类指定了所有的标准和一般行为(使用”virtual”),然后委派子类(由客户端指定的类)去完成构造细节。
工厂方法的这种设计有更多的自定义性,稍微有一点复杂,其他设计模式需要新的类,但是工厂方法只需要”New”操作。
人们经常使用工厂方法作为创建对象的基本方法。但它并不是必须的,如果:被实例化的类从不改变,或实例化发生在一个操作中,而且子类很容易覆写他(例如在初始操作中)。
工厂方法类似于抽象工厂,只是它的重点不是产品族。
工厂方法的执行由框架来指定,然后由框架的用户来实现。
结构:
工厂方法中较为流行的一种做法是用一个静态方法,并返回对象类型(抽象类型)。它不同于构造函数,返回的实际对象可能是自类的实例,可能是已存在的对象。工厂方法有不同和更多的描述名称。如Color.make_RGB_color(float red, float green, float blue) and Color.make_HSB_color(float hue, float saturation, float brightness
.客户端在衍生类的实现细节上被完全削弱了,这就使多态性成为可能。
经验:
抽象工厂经常由工厂方法来实现,但也能用原型模式来实现。
工厂方法经常在模板方法中使用。
工厂方法:通过继承来产生。 原型模式:通过委托来产生。
原型模式不需要子类化,但在初始操作中需要。工厂方法需要子类化,并不需要初始操作。
高级的工厂方法在调用多次后能够返回同一个实例,或返回一个子类,而不是准确类型的对象。
“New”永远创建对象,而不能封装对象创建。工厂方法进行封装,允许一个对象被请求,而不需要和实际创建耦合。