一、什么是单例模式
单例模式是一种对象创建型模式,使用单例模式,
可以保证为一个类只生成唯一的实例对象。也就是说,
在整个程序空间中,该类只存在一个实例对象。
其实,GoF对单例模式的定义是:保证一个类、
只有一个实例存在,同时提供能对该实例加以访
问的全局访问方法。
二、为什么要使用单例模式呢?
在应用系统开发中,我们常常有以下需求:
- 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象
- 在整个程序空间使用全局变量,共享资源
- 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。
因为Singleton模式可以保证为一个类只生成唯一的实例
对象,所以这些情况,Singleton模式就派上用场了。
三、单例模式实现
1.饿汉式。
2.懒汉式。
3.双重检查。
饿汉式单例
已经有现成的对象,直接拿来用
1 public class Person { 2 public static final Person person = new Person();//饿汉式单例 3 private String name; 4 5 6 public String getName() { 7 return name; 8 } 9 10 public void setName(String name) { 11 this.name = name; 12 } 13 14 //构造函数私有化 15 private Person() { 16 } 17 18 //提供一个全局的静态方法 19 public static Person getPerson() { 20 return person; 21 } 22 }
懒汉式单例
获取之前先判断 是否是 null
1 public class Person2 { 2 private String name; 3 private static Person2 person; 4 5 public String getName() { 6 return name; 7 } 8 9 public void setName(String name) { 10 this.name = name; 11 } 12 13 //构造函数私有化 14 private Person2() { 15 } 16 17 //提供一个全局的静态方法 //懒汉式单例 18 public static Person2 getPerson() { 19 if(person == null) { 20 person = new Person2(); 21 } 22 return person; 23 } 24 }
双重检查式单例
2次判断 是否是null
synchronized:线程同步
1 public class Person4 { 2 private String name; 3 private static Person4 person; 4 5 public String getName() { 6 return name; 7 } 8 9 public void setName(String name) { 10 this.name = name; 11 } 12 13 //构造函数私有化 14 private Person4() { 15 } 16 17 //提供一个全局的静态方法 18 public static Person4 getPerson() { 19 if(person == null) { 20 synchronized (Person4.class) { 21 if(person == null) { 22 person = new Person4(); 23 } 24 } 25 26 } 27 return person; 28 } 29 }