为什么要使用getInstance

时间:2012-12-10 06:54:41

标签: java design-patterns

许多公开的Java API似乎都使用getInstance来生成和返回一个对象。我很好奇为什么会这样 - 为什么不使用默认/参数化构造函数呢?

是否存在相关的设计模式?

7 个答案:

答案 0 :(得分:7)

我建议阅读Joshua Bloch撰写的“Effective Java”,第1项“考虑静态工厂方法而不是构造函数”。他领导了众多Java平台功能的设计和实现,他知道原因。

答案 1 :(得分:4)

它与Singleton Pattern相关联。

很多时候还有Factory Methods可以帮助您创建对象。

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

工厂方法的优点是它们比一系列构造函数更加冗长和易于掌握。

答案 2 :(得分:2)

另一个例子(除了单例或多吨模式)是你需要在构造函数中做一些通常不推荐的事情,比如注册一个监听器或启动一个线程:

class Whatever {

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

答案 3 :(得分:1)

是....它与Factory和Singleton模式相关联。工厂模式用于将对象创建逻辑与业务逻辑分离,而Singleton模式用于在整个应用程序中仅维护对象的单个实例。

答案 4 :(得分:1)

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

这是Factory Method模式的一种情况。使用它的最常见原因是:

  1. 如果构造太复杂而无法在构造函数中处理
  2. 如果施工需要不允许或不需要的行动 构造
  3. 将产品类型(“界面”)与实际实施(“类”)分离。
  4. 出于表现或建筑理由,例如在施工时执行部分专业化
  5. 为了清晰/可读性
  6. 这些原因之间存在一些重叠。事实上,通常所有四个都适用。部分特化(4)几乎需要解耦类型和实现(3)。

答案 5 :(得分:1)

“为什么不只是使用默认/参数化构造函数”,因为在你调用构造函数时已经太晚了以确保Singleton Pattern约束只有一个实例。重点是对单个实例进行受控访问并避免多个实例。唯一的方法是使用访问修饰符来阻止构造函数被访问。

答案 6 :(得分:0)

正如人们所说,提供简单/安全的解决方案是一些模式设计“要求”的问题。

但是你应该尽可能避免使用“getInstance”(java.lang.Class.getInstance()'和'java.lang.Class.NewInstance()')的动态实例化< / strong>,因为动态实例化比常规的类调用或方法调用慢。

仅在必要时使用它!