单例模式

一、什么是单例模式


单例模式是一种对象创建型模式,使用单例模式,
可以保证为一个类只生成唯一的实例对象。也就是说,
在整个程序空间中,该类只存在一个实例对象。
    其实,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 }
原文地址:https://www.cnblogs.com/YangBinChina/p/13803352.html