04单例模式Singleton

一、什么是单例模式

  单例模式是一种对象创建型模式,使用单例模式, 可以保证为一个类只生成唯一的实例对象。也就是说, 在整个程序空间中,该类只存在一个实例对象。

   其实,GoF对单例模式的定义是:保证一个类、 只有一个实例存在,同时提供能对该实例加以访 问的全局访问方法。

二、为什么要使用单例模式呢?

  在应用系统开发中,我们常常有以下需求:

    - 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象

    - 在整个程序空间使用全局变量,共享资源

    - 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

  因为Singleton模式可以保证为一个类只生成唯一的实例 对象,所以这些情况,Singleton模式就派上用场了。

三、单例模式实现

  1.饿汉式。 2.懒汉式。 3.双重检查。

饿汉式

 1 //饿汉式
 2 public class Person {
 3     public static final Person person = new Person();
 4     private String name;
 5     
 6     
 7     public String getName() {
 8         return name;
 9     }
10 
11     public void setName(String name) {
12         this.name = name;
13     }
14     
15     //构造函数私有化
16     private Person() {
17     }
18     
19     //提供一个全局的静态方法
20     public static Person getPerson() {
21         return person;
22     }
23 }

懒汉式

 1 //懒汉式
 2 public class Person2 {
 3     private String name;
 4     private static Person2 person;
 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 Person2() {
16     }
17     
18     //提供一个全局的静态方法
19     public static Person2 getPerson() {
20         if(person == null) {
21             person = new Person2();
22         }
23         return person;
24     }
25 }

懒汉式同步

 1 //懒汉式,使用同步方法synchronized
 2 public class Person3 {
 3     private String name;
 4     private static Person3 person;
 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 Person3() {
16     }
17     
18     //提供一个全局的静态方法,使用同步方法
19     public static synchronized Person3 getPerson() {
20         if(person == null) {
21             person = new Person3();
22         }
23         return person;
24     }
25 }

双重检查

 1 //双重检查
 2 public class Person4 {
 3     private String name;
 4     private static Person4 person;
 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 Person4() {
16     }
17     
18     //提供一个全局的静态方法
19     public static Person4 getPerson() {
20         if(person == null) {
21             synchronized (Person4.class) {
22                 if(person == null) {
23                     person = new Person4();
24                 }
25             }
26             
27         }
28         return person;
29     }
30 }

测试方法

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         Person2 per = Person2.getPerson();
 4         Person2 per2 = Person2.getPerson();
 5         per.setName("zhangsan");
 6         per2.setName("lisi");
 7         
 8         System.out.println(per.getName());
 9         System.out.println(per2.getName());
10     }
11 }

猜你喜欢

转载自www.cnblogs.com/justdoitba/p/9031887.html