java - 为什么工厂模式中的getInstance()方法应该是静态的?

标签 java factory-pattern

在大多数工厂模式实现中,getInstance 方法通常声明为静态的。工厂模式的主要优点是隐藏了实现细节,但是为什么getInstance()方法需要是静态的呢?实例化新工厂对象是一种不好的做法吗?

XYZFactory factory = new XYZFactory(); 
XYZObj obj = factory.getInstance(TYPE);

对比

XYZObj obj = XYZFactory.getInstance(TYPE);

最佳答案

许多工厂方法 用于提供类本身的实例,而类不导出任何构造函数(参见例如 Josh Bloch item 1 )。如果工厂方法是一个实例方法,那么您将没有该类的对象。

此外,getInstance() 通常独立于任何现有实例,因此应将其声明为静态的。如果它依赖于一个,通常首选原型(prototype)(即clone())。

最后,您应该区分工厂方法 public static getInstance()抽象工厂,这是一个通常为多个接口(interface)隐藏实现细节的类。当然,您必须能够实例化抽象工厂的子类。您可以在 classic Design Patterns book from the Gang of Four 中找到对创建模式(抽象工厂、工厂方法、原型(prototype)等)的精彩介绍。 .它还给出了一个与原型(prototype)混合的非静态工厂方法的示例。所以你看,很多变体都是可能的......

关于java - 为什么工厂模式中的getInstance()方法应该是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7393700/

相关文章:

java - 为什么 Jackson 多态序列化在列表中不起作用?

java - 根据android版本从两个版本的库中加载类

Spring - 简单地创建Supplier<MyPrototypeBean>

python - 将不同文件中的类注册到类工厂

java - Java Panel有时不会完全更新

java - 相对文件路径在 Java 中不起作用

java - 如何在Intellij中将模块+配置的名称包含到IvyIDEA库名称中

java - 如何利用Spring Boot原生支持更好的实现工厂模式?

c++派生类型的自动工厂注册

java - 我是否正确地实现了基于泛型的 Java 工厂?