作用
用于保证整个应用中的某个实例有且只有一个。
创建多个实例会造成占用过多资源,不一致结果。
应用场景
有些对象我们只需要一个,如:配置文件、工具类、线程池、缓存、日志对象等。
实现
【目的】整个应用只需要一个Singleton类的实例。
【实现关键】将构造方法私有化,不允许外部直接创建对象。
>饿汉模式——在类加载时便创建singleton实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**
* 饿汉模式
* @author mok
*
*/
public
class
Singleton {
//1、将构造方法私有化,防止通过new实例化多个本类的实例
private
Singleton(){};
//3、创建类的唯一实例,用private修饰防止被"篡改"
private
static
Singleton instance =
new
Singleton();
//2、由于不允许直接创建对象,故需要提供public static的获取实例的方法
public
static
Singleton getInstance(){
return
instance;
}
}
|
>懒汉模式——在运行时才创建singleton实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/**
* 懒汉模式
* @author mok
*
*/
public
class
Singleton {
//1、将构造方法私有化,防止通过new实例化多个本类的实例
private
Singleton(){};
//3、创建类的唯一实例,用private修饰防止被"篡改"
private
static
Singleton instance =
null
;
//2、由于不允许直接创建对象,故需要提供public static的获取实例的方法
//△懒汉模式是非线程安全的,故获取单例的方法需要用synchronized修饰
public
static
synchronized
Singleton getInstance(){
if
(instance ==
null
)
instance =
new
Singleton();
return
instance;
}
}
|
【饿汉模式 vs. 懒汉模式】
饿汉模式:加载类时比较慢,但运行时获取对象的速度比较快;线程安全;
懒汉模式:加载类时比较快,但运行时获取对象的速度比较慢;非线程安全;