大家好,javaRush!
今天给大家讲一下设计模式
Singleton
(单)。
目标:创建一个只有一个对象的类。这意味着无论访问多少次,都会返回第一次创建的同一个对象。这是一件很方便的事情,在很多地方都是必要的,它被实现到框架中并不是没有原因的。
应用:
- 例如,您需要将数据库连接到项目以及负责连接到该项目的类。连接创建一次,无需多次创建
Application settings
— 负责应用程序所需的连接设置的类:数据库主机和端口等。它们创建一次并在应用程序的整个操作过程中使用。
- 还有很多我没有提到的例子,所以请在评论中写下你的选择!=)
在这个介绍之后,据我了解,我们可以展示这个类的一个例子:(尽管我相信我们每个人都可以想出这个类的实现)这是最简单的例子,当我们将构造函数设为私有时,即 您无法显式创建对象。并且有一个
getInstance()
提供对象的静态方法。
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
多线程有问题,那么可以放一个
getInstance()
标记方法
synchronized
:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
最后,像往常一样,我想说,如果你有不同的想法或者发现我的错误,请写在评论中!我们将愉快地讨论一切:)如果您喜欢这篇文章,请写“+”,我会知道的。这对我来说很重要:) PS 我正在添加更多实现:根据
Joshua Bloch 的说法,这是实现模板的最佳方式
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
并进一步
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
延迟初始化
+
高性能
-
不能用于非静态类字段 任何问题/建议 - 写在评论中!
另请参阅我的其他文章:
GO TO FULL VERSION