为什么要使用getInstance

3
很多公开的Java API似乎都使用getInstance来生成和返回对象。我很好奇为什么会这样,为什么不直接使用默认/参数化构造函数呢?是否有相关的设计模式?
7个回答

7

我建议阅读 Joshua Bloch 的 "Effective Java",其中第1条是"考虑使用静态工厂方法代替构造函数"。他领导了许多 Java 平台特性的设计和实现,他知道为什么。


4

这与单例模式有关。

在许多情况下,还有工厂方法可以帮助您创建对象。

例如:Boolean.parseBoolean("true");

工厂方法的优点是它们比一系列构造函数更具可读性和易懂性。


2

除了单例或多例模式之外,另一个例子是如果你需要在构造函数中执行通常不推荐的操作,比如注册监听器或启动线程:

class Whatever {

    private Whatever() {} //private constructor
    public Whatever getInstance() {
        Whatever w = new Whatever();
        startSomeThread();
        return w;
    }
}

1

是的...它与工厂模式和单例模式都有关联。工厂模式用于将对象创建逻辑与业务逻辑解耦,而单例模式用于在整个应用程序中仅维护一个对象实例。


1

为了让您省去查找具体原因的麻烦...

这是工厂方法模式的一个案例。使用它最常见的原因有:

  1. 如果在构造函数中处理起来过于复杂
  2. 如果构造需要执行构造函数中不允许或不希望进行的操作
  3. 将产品类型("接口")与实际实现("类")解耦
  4. 出于性能或架构原因,例如在构建时执行部分特化
  5. 为清晰度/可读性。

这些原因之间存在一些重叠。实际上,通常所有四个都适用。部分特化(4)几乎需要解耦类型和实现(3)。


1
“为什么不使用默认/参数化构造函数呢?”因为在调用构造函数时,已经太晚了,无法确保单例模式约束只有一个实例。整个重点是要控制对单个实例的访问并避免多个实例。唯一的方法是使用访问修饰符来防止构造函数被访问。

0
正如所说,提供一个简单/安全的解决方案是一些模式设计“要求”的问题。
但是在动态实例化方面,应尽可能避免使用“getInstance”(java.lang.Class.getInstance()和java.lang.Class.NewInstance()),因为动态实例化比常规类调用或方法调用慢。
只有在必要时才使用它!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接