不是所有的工厂方法都是静态的吗?产生产品的东西需要状态吗?何时适合实例工厂或静态工厂方法?你能举例说明两者的区别吗?
假设通过“实例工厂方法”你实际上是在谈论GoF“工厂方法”,Joshua Bloch在他的书“Effective Java”中描述了术语“静态工厂方法”。谷歌搜索我到达这些网站:
希望它有助于使差异更加清晰。
遵循Marvo的建议:
示例(Java代码):
public abstract class Product { ... }
public class ConcreteProduct extends Product { ... }
public abstract class Creator {
public void anOperation() { ... product = factoryMethod(); ... }
public abstract Product factoryMethod();
}
public class ConcreteCreator extends Creator {
public Product factoryMethod() { return new ConcreteProduct(); }
}
示例(Java代码):
public class Boolean {
...
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
...
}
我目前的偏好是为了更容易测试,使工厂方法不是静态的。您无法在运行时更改静态工厂方法调用,而如果我可以为对象提供工厂实现,那么我可以更彻底地测试它,因为我可以更好地控制上下文和对象图。
如果您从工厂返回一个Singleton,那么您将需要确保只有一个实例,如果您要在每次调用工厂时创建一个新实例,然后将其设置为静态。
这取决于,例如,您可以拥有一个只生产一定数量对象的工厂,在这种情况下会有一个相关的状态。在大多数情况下,工厂方法可以是静态的,只要它们不依赖于任何非静态变量(例如非静态全局变量等)来创建它们。它还倾向于区分不同工厂的不同部分应用程序,因此根据工厂中是否存在状态,您可能会认为所有工厂方法都应该是静态的,请查看哪些情况适用于你并适当地写出来。
另一个考虑因素是static关键字,这会导致静态内容只在内存中实例化一次,但缺点是它始终驻留在进程内存中(这会增加工作集大小)。这可能是你不想要的东西,因为你的工厂在某些区域可能具有非常高的位置,否则它只会在其他地方使用内存,但这通常是一个优化问题,只有在内存问题时才应该查看你的申请中出现了压力。
如果之前需要实例,那么您可以使用静态工厂,否则实例化工厂本身并将其传递给您的代码。