3

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

是否有相关的设计模式?

4

7 回答 7

7

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

于 2012-12-10T06:58:01.487 回答
4

它与Singleton Pattern相关联。

很多时候,还有工厂方法可以帮助您创建对象。

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

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

于 2012-12-10T06:56:49.803 回答
2

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

class Whatever {

    private Whatever() {} //private constructor
    public Whatever getInstance() {
        Whatever w = new Whatever();
        startSomeThread();
        return w;
    }
}
于 2012-12-10T07:00:11.833 回答
1

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

于 2012-12-10T07:01:10.667 回答
1

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

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

  1. 如果构造太复杂而无法在构造函数中处理
  2. 如果构造需要构造函数中不允许或不希望的操作
  3. 将产品的类型(“接口”)与实际实现(“类”)分离。
  4. 出于性能或架构原因,例如在构建时执行部分专业化
  5. 为了清晰/可读性

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

于 2012-12-10T12:31:00.003 回答
1

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

于 2012-12-10T13:09:32.310 回答
0

正如已经说过的那样,提供简单/安全的解决方案是一些模式设计“要求”的问题。

但是在动态实例化方面你应该尽量避免使用“getInstance”(java.lang.Class.getInstance()'和'java.lang.Class.NewInstance()'),因为动态实例化比常规类调用或方法调用。

仅在必要时使用!

于 2012-12-20T11:35:04.937 回答