Java设计模式-单例模式
在长期的程序设计过程中,开发者们总结出了很多设计经验,最终经过整理和优化,变成了如今的设计模式;
设计模式有很多 有单例,工厂,代理等等。这里推荐一本关于Java设计模式的书籍 Head First设计模式
今天我们这里讲解的是最常用的单例模式;
在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在;
有两种实现,一种是饿汉式,一种是懒汉式;
我们上下代码,先上 饿汉式实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package
com.java1234.chap03.sec18;
public
class
Singleton {
/**
* 构造方法私有
*/
private
Singleton(){
}
/**
* 饿汉式单例实现
*/
private
static
final
Singleton single=
new
Singleton();
/**
* 获取实例
*/
public
static
Singleton getInstance(){
return
single;
}
}
|
这里我们构造方法私有 这样就保证了在外部是无法来实例化对象;
然后我们先在内部定义一个静态常量对象,然后再写一个static方法 来返回这个对象,这样就保证是一个对象了;
我们上下测试类:
1
2
3
4
5
6
7
8
9
10
|
package
com.java1234.chap03.sec18;
public
class
Test {
public
static
void
main(String[] args) {
Singleton singleton1=Singleton.getInstance();
Singleton singleton2=Singleton.getInstance();
System.out.println(singleton1==singleton2);
}
}
|
运行输出:
true
这里获取里两个对象 我们前面讲过 用“==”来判断对象是否指向同一个内存区域,这里返回true,说明是同一个对象;
我们这里再来实现下 懒汉式子:
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
|
package
com.java1234.chap03.sec18;
public
class
Singleton2 {
/**
* 构造方法私有
*/
private
Singleton2(){
}
/**
* 懒汉式单例实现 在第一次调用的时候实例化
*/
private
static
Singleton2 single;
/**
* 获取实例
*/
public
synchronized
static
Singleton2 getInstance(){
if
(single==
null
){
System.out.println(
"第一次调用的实例化"
);
single=
new
Singleton2();
}
return
single;
}
}
|
我们可以看到 区别 饿汉式是先定义实例的 而懒汉式是先定义引用,当第一次调用getInstance的时候 进行对象实例化操作;
当然这里我们考虑到多并发的情况 多个线程同时调用这个方法的时候,会出现问题,所以我们加了同步锁 synchronized 来保证
同一时刻只有一个线程进入方法;
再上下测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
com.java1234.chap03.sec18;
public
class
Test {
public
static
void
main(String[] args) {
Singleton singleton1=Singleton.getInstance();
Singleton singleton2=Singleton.getInstance();
System.out.println(
"饿汉式:"
+(singleton1==singleton2));
Singleton2 singleton3=Singleton2.getInstance();
Singleton2 singleton4=Singleton2.getInstance();
System.out.println(
"懒汉式:"
+(singleton3==singleton4));
}
}
|
运行输出:
饿汉式:true
第一次调用的实例化
懒汉式:true