java - Singleton的2种实现

标签 java design-patterns static singleton

我知道在 Java 中实现单例模式的两种方法,我想知道哪一种更好以及为什么。

第一种方法是:

  1. 将类的构造函数声明为私有(private)
  2. 让类中的所有内容都是静态的 - 基本上让类实例本身成为单例

第二种方法是:

  1. 将类的构造函数声明为私有(private)
  2. 有一个静态成员来保存单例(可能是类的实例)
  3. 有一个静态 getInstance() 方法

我倾向于认为,即使第二种方法是最常见的,第一种方法可能会产生更好的代码可读性,这两种方法在运行时复杂性方面似乎同样有效,所以我真的不明白第二种方法背后的原因更常见且被认为是更好的实践...

请赐教!

最佳答案

第一种方法不是单例。 单例是一个只能存在一个实例的类,不能多也不能少。第一个有时称为“静态类”、“实用程序类”或“不可实例化类”。

有很多事情可以用“真正的”单例来完成,而用实用程序类则无法完成。例如,您可以有一个实现接口(interface)或扩展另一个类的单例;你不能用全静态方法来做到这一点。 all-static-methods 类通常是没有进行面向对象设计分析的证据

至于Java中有多少种实现单例模式的方法,实际上有很多有趣的方法,使用不同的语言特性来推迟初始化直到绝对需要时:类加载、枚举或只是一个同步块(synchronized block)和一个if

关于java - Singleton的2种实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11731771/

相关文章:

design-patterns - Haskell:设计模式:类或传递函数

c# - 使用多个装饰器为对象添加功能?

c++ - 无法在 eclipse helios 中使用静态库创建 cpp 项目

java - 转换 SQLite 查询日期格式

java - 在特殊情况下使用 XPATH 提取属性值

java - Android 4.0 -> 4.3(包括在内)- WebView 页面之间的网络存储丢失

c++ - 如何从静态类函数初始化静态类对象

java - 覆盖 Java 中的 protected 方法

c# - 创建装饰器。设计模式

objective-c - 保留静态数组会导致非弧项目泄漏吗?