工厂类是静态的,而工厂方法也是静态的.
设计模式书中的GOF是否规定工厂及其方法必须是静态的,以满足模式的严格定义?
工厂+ /方法静态只是模式的结果吗?状态数据通常不由工厂类维护,因此它们通常是静态的.
Dou*_*ugC 22
我不相信存在对模式的"严格定义"这样的事情.通过它们的本质模式来捕捉问题的本质,这些问题在软件中一次又一次地出现并概述解决方案的外观.
特别是使用Factory模式,不,不要求工厂方法是静态的.模式的本质是你有一个对象负责创建另一个类的实例.你如何做到这一点取决于你,虽然模式中描述的一种常见方法是在类上使用静态方法.但是,我们的一个系统中有一个工厂机制,实际上是两个阶段.您可以在类上使用静态方法来创建工厂对象,该工厂对象可以配置为在一组实现中进行选择,然后使用工厂对象来标记您需要执行实际工作的对象实例.
还要考虑使用没有静态方法的语言实现工厂模式.例如,在Scala中,您将使用对象而不是类.虽然这种行为很像在Java中使用静态方法,但实现的性质却大不相同.
不,工厂类默认不应该是静态的。实际上,静态类在 OOP 世界中并不受欢迎,因为它们也可以传达一些状态,从而引入全局应用程序状态。如果您只需要一个工厂对象,您可以通过单例模式控制它的创建。
在工厂方法的情况下- 可以保持静态(实际上没有其他合理的方法:))。
这取决于您的需求。我通常更喜欢静态方法来创建:
SpaceShip spaceShip = SpaceShipFactory.create();
Run Code Online (Sandbox Code Playgroud)
此外,Java 在大多数情况下对工厂使用静态方法。
Calendar calendar = Calendar.getInstance();
Run Code Online (Sandbox Code Playgroud)
但是如果我们要从同一个工厂创建多个实例。也许我们可以更喜欢非静态方式。为此,我们需要一些有状态字段作为算法。
SSHKeyFactory factory = new SshKeyFactory(Algorithm.RSA);
Key client1Key = factory.createKey();
Key client2Key = factory.createKey();
...
Run Code Online (Sandbox Code Playgroud)