Java设计模式之单例模式

Java设计模式之单例模式

最近公司项目封版,有了很多的闲暇时间。
“无聊”之余,发现很久没有整理一下有道云笔记了。
虽然偶尔会往里面记录一些内容,但是长时间没回顾,也容易忘记。
趁着这段时间,刚好整理一下笔记,还可以放在博客上发布出来,何乐而不为?
那么接下来这段时间就逐步把笔记整理成博客吧。
首先,就从单例模式开始!

本文主要目的是举例几个单例模式的实现方式。
废话不多说,直接上代码


懒汉/恶汉记忆方法

  1. 懒汉:太懒,直到获取对象时getInstance()才创建对象new MySingleton()。
  2. 恶汉:太饿了,必须先创建对象new MySingleton(),才让别人获取getInstance()

1. 懒汉模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MySingleton {  

private static MySingleton instance = null;

private MySingleton(){}

public static MySingleton getInstance() {
if(instance == null){
//懒汉式,别人获取它时才创建对象
instance = new MySingleton();
}
return instance;
}
}

2. 恶汉模式

1
2
3
4
5
6
7
8
9
10
11
12
public class MySingleton {  

//饿汉,先创建对象
private static MySingleton instance = new MySingleton();

private MySingleton(){}

public static MySingleton getInstance() {
return instance;
}

}

3. 枚举方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum EnumFactory{   

singletonFactory;

private MySingleton instance;

//枚举类的构造方法在类加载是被实例化
private EnumFactory(){
instance = new MySingleton();
}

public MySingleton getInstance(){
return instance;
}
}

4. 内部类实现方式

Java机制规定,内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了延迟加载效果),而且其加载过程是线程安全的(实现线程安全)。内部类加载的时候实例化一次instance

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Singleton
{
//构造器私有化
private Singleton(){ }

/**
* 获取对象实例的静态方法
* @return
*/
public static Singleton getInstance()
{
return SingletonHolder.instance;
}

//静态内部类,在第一次被引用时被加载,私有
private static class SingletonHolder
{
private static Singleton instance = new Singleton();
}

public static void main(String args[])
{
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance1 == instance2);
}
}

5.参考文章

高并发下线程安全的单例模式

作者

Trainoo

发布于

2018-06-24

更新于

2020-06-02

许可协议