工厂类通常是静态的,工厂方法也是静态的。
设计模式书中的GOF是否规定工厂及其方法必须是静态的,以满足模式的严格定义?
工厂+ /方法静态只是模式的结果吗?状态数据通常不由工厂类维护,因此它们通常是静态的。
答案 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
,则我们为该类创建一个对象,并将状态设置为该对象。这次我们可以选择static
或instance
方法。
答案 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();
...