2009-10-15 67 views
14

工厂类是静态的,工厂方法也是静态的。工厂创建方法始终是静态的?

设计模式书中的GOF是否曾经规定工厂及其方法必须是静态的以满足模式的严格定义?

工厂+ /方法是静态模式的结果吗?状态数据通常不由工厂类维护,因此它们通常是静态的。

回答

11

我不认为有这样的事情是一种模式的“严格定义”。通过它们的本质模式来捕捉问题的本质,这些问题在软件中一次又一次地出现并概述解决方案的外观。

特别是对于工厂模式,不,不要求工厂方法是静态的。模式的本质是你有一个对象负责创建另一个类的实例。你如何做到这一点真的取决于你,尽管模式中描述的一种常见方式是在类上使用静态方法。但是,我们的系统中有一个工厂机制,实际上是两阶段的。您可以在类上使用静态方法来创建工厂对象,该工厂对象可以被配置为在一组实现中进行选择,然后使用工厂对象来标记需要进行实际工作的对象实例。

也考虑在没有静态方法的语言中实现工厂模式。例如,在Scala中,你会使用一个对象而不是一个类。虽然这种行为很像在Java的类中使用静态方法,但实现的性质却大不相同。

+2

+1真正重要的是不要期望模式能够为你做出思考,模式不严格,模式不宽松,模式无法控制! – djna 2009-10-15 08:44:11

6

不,工厂可以保持状态。这取决于需要什么。

我建议制作静态在第一个例子中似乎是个不错的选择 - 当你尝试单元测试你倾向于遇到问题的静态时。

转向,直到你特别需要它们。

+0

对某些语言 – 2012-05-25 16:22:41

3

不,工厂类别默认情况下不应该是静态的。实际上,OOP世界并不欢迎静态类,因为它们也可以传达某种状态,因此引入了全局应用程序状态。如果你只需要一个工厂对象,你可以通过单例模式来控制它的创建。

如果是工厂方法 - 可以保持静态(实际上没有其他合理的方法:))。

0

我想我的BlueCarFactory和我的RedCarFactory都有一个方法createCar。通过参数化重用实际创建方法是常识。然后创建一个CarFactory(blue)和一个CarFactory(red)。这意味着CarFactory对象需要一个成员变量来存储生产的汽车的颜色。结论:使Factory类的方法静态是没有意义的。创建单体Factory对象确实有意义。