设计模式之单例模式

Posted elegantwp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之单例模式相关的知识,希望对你有一定的参考价值。

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。

这就是单例模式的描述,在接下来我们将详细讲讲单例模式在Java语言中的具体实现。首先我们先介绍双重锁检测机制。

public class Singleton1 {
private Singleton1() {

}

public static volatile Singleton1 instance = null;

public static Singleton1 getInstance() {

if (instance == null) {
synchronized (Singleton1.class) {
if (instance == null) {
instance = new Singleton1();
}
}
}
return instance;

}
}

为什么这样写呢?我们来解释几个关键点:

 

1.要想让一个类只能构建一个对象,自然不能让它随便去做new操作,因此Signleton的构造方法是私有的。

 

2.instance是Singleton类的静态成员,也是我们的单例对象。它的初始值可以写成Null,也可以写成new Singleton()。至于其中的区别后来会做解释。

 

3.getInstance是获取单例对象的方法。

 

如果单例初始值是null,还未构建,则构建单例对象并返回。这个写法属于单例模式当中的懒汉模式。

 

如果单例对象一开始就被new Singleton()主动构建,则不再需要判空操作,这种写法属于饿汉模式

 

这两个名字很形象:饿汉主动找食物吃,懒汉躺在地上等着人喂

我们接下来说说恶汉模式与懒汉模式的区别:我个人认为在不考虑反射构造的情况下,懒汉模式通过时间换空间,饿汉模式则是通过空间换取时间。懒汉模式通过

synchronized关键字保证线程安全,饿汉模式通过类加载机制保证线程安全

接着我们看静态内部类的实现方法

技术分享图片

这样的实现方法很巧妙 ,通过的类的延迟加载解决了线程安全。

最后一种是通过枚举的方法只需要将上面的代码上加入一行

public enum SingletonEnum {
  instance;
}

注意使用枚举构建的单例模式不仅能够防止反射构建对象而且可以保证线程安全,这种方式唯一的缺点是并非适用懒加载,契丹李对象在枚举类被夹在是初始化

 

最后用一张图对以上方式实现的单例模式做一个总结

技术分享图片

 






















以上是关于设计模式之单例模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之单例模式

JAVA设计模式之单例模式(转)

单例模式之单例模式

JAVA设计模式之单例模式

《JAVA与模式》之单例模式

《JAVA与模式》之单例模式