在开发过程中常常会有这样的需求:
- 在多个线程之间,共享同一个资源或者操作同一个对象。
- 在整个程序空间使用全局变量,共享资源。
这样就需要保证一个类只生成一个唯一的实例对象。这就是单例模式了。
GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
下面来看结构图(摘至 程杰 大话设计模式)
设计模式类时要注意两点:
- 构造方法需要private,防止外界利用new 创建类实例。
- 提供一个静态方法,为本类实例唯一的全局访问点。
单例模式有两种创建方式:
- 饿汉式:利用静态初始化的方式,在类加载时就将自己实例化。静态方法返回这唯一的实例。
- 懒汉式:在第一次使用时,经过判断后,才会将自己实例化。在多线程场景下,需加锁和双重检查保证只实例化一次。
下面来看代码吧
1、饿汉式
public class Person {
// 静态初始化
public static final Person person = new Person();
//构造函数私有化
private Person() {
}
//提供一个全局的静态方法
public static Person getPerson() {
return person;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、懒汉式
public class Person{
private static Person person;
//构造函数私有化
private Person4() {
}
//提供一个全局的静态方法
public static Person4 getPerson() {
if(person == null) {
synchronized (Person.class) {
if(person == null) {
person = new Person();
}
}
}
return person;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
总结:
当遇到需要保证一个类只生成一个唯一的实例对象的场景时,就可以使用单例模式了。饿汉式类加载时初始化实例,提前占用系统资源;懒汉式需要考虑多线程访问安全问题。所以需要根据实际的业务场景来选择。