工厂创建方法总是静态?

时间:2009-10-15 08:25:29

标签: design-patterns

工厂类通常是静态的,工厂方法也是静态的。

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

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

6 个答案:

答案 0 :(得分:18)

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

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

还要考虑使用没有静态方法的语言实现工厂模式。例如,在Scala中,您将使用对象而不是类。虽然这种行为很像在Java中对类使用静态方法,但实现的性质却大相径庭。

答案 1 :(得分:8)

不,工厂可以持有州。这取决于需要什么。

我建议制作静态似乎是第一个例子中的好选择 - 当你试图通过单元测试静态时,你会遇到问题。

转身离开,直到你特别需要它们为止。

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

我猜我的BlueCarFactory和我的RedCarFactory都有createCar方法。通过参数化重用实际的创建方法只是常识。然后,可以创建CarFactory(blue)CarFactory(red)。这意味着CarFactory对象需要一个成员变量来存储生产的汽车的颜色。

结论:将Factory类的方法设为静态是没有意义的。创建单例Factory对象确实有意义。

答案 4 :(得分:0)

Static Method的使用与任何设计模式均无关。这是我们使用Class level还是实例级方法的选择。 Factory类不需要维护任何状态。所以通常我们去Static method。如果确实需要state,则我们为该类创建一个对象,并将状态设置为该对象。这次我们可以选择staticinstance方法。

答案 5 :(得分:0)

这取决于您的需要。我通常更喜欢使用静态方法进行创建:

SpaceShip spaceShip = SpaceShipFactory.create();

此外,在大多数情况下,Java对工厂使用静态方法。

Calendar calendar = Calendar.getInstance();

但是如果我们要从同一工厂创建多个实例。也许我们可以选择非静态方式。为此,我们需要一些状态字段作为算法。

SSHKeyFactory factory = new SshKeyFactory(Algorithm.RSA);
Key client1Key = factory.createKey();
Key client2Key = factory.createKey();
...