Java设计模式(学习整理)---单例模式

1、概念:

java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
  单例模式有一下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

2、举例说明:

2.1懒汉式单例

 1 /**
 2  *    单例模式测试:
 3  *            ---懒汉模式
 4  * @author 小风微灵
 5  *
 6  */
 7 public class SingleMode {
 8     
 9     /*
10      * 第一步:创建一个本身的私有对象:不初始化
11      */
12     private    static SingleMode single=null;
13     
14     /**
15      * 第二步:私有化构造器:使得该类不能被new出对象
16      */
17     private SingleMode(){}
18     
19     /**
20      * 第三步:一个静态的获取私有对象方法
21      */
22     public static SingleMode getInstance(){
23         
24         if(single==null){
25             single=new SingleMode();
26         }
27         return single;
28     }
29 }

2.2饿汉式单例

 1 /**
 2  *    单例模式测试:
 3  *            ---饿汉模式
 4  * @author 小风微灵
 5  *
 6  */
 7 public class SingleMode_EH {
 8     /*
 9      * 第一步:创建一个本身的私有对象:初始化
10      */
11     private    static SingleMode_EH single_=new SingleMode_EH();
12     
13     /**
14      * 第二步:私有化构造器:使得该类不能被new出对象
15      */
16     private SingleMode_EH(){}
17     
18     /**
19      * 第三步:一个静态的获取私有对象方法
20      */
21     public static SingleMode_EH getInstance(){
22         
23         return single_;
24     }
25 }

 2.3登记式单例

 1 package mode_single;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 /**
 7  *    单例模式测试:
 8  *            ---登记式单例模式
 9  * @author 小风微灵
10  *
11  */
12 public class SingleMode_DJS {
13     private static Map<String,SingleMode_DJS> map = new HashMap<String,SingleMode_DJS>();
14     /**
15      * 静态块:事先把实例存放在表Map中
16      */
17     static{
18         SingleMode_DJS single = new SingleMode_DJS();
19         map.put(single.getClass().getName(), single);
20     }
21     /**
22      * 构造器:受保护
23      */
24      protected SingleMode_DJS(){}
25      /**
26       * 静态工厂方法,返还此类惟一的实例
27       * @param name        Map集合中的实例"键":的名称
28       * @return            返回登记式单例对象
29       */
30      public static SingleMode_DJS getInstance(String name) {
31              if(name == null) {
32                   name = SingleMode_DJS.class.getName();
33               }
34               if(map.get(name) == null) {
35                    try{
36                           map.put(name, (SingleMode_DJS) Class.forName(name).newInstance());
37                       } catch (InstantiationException e) {
38                           e.printStackTrace();
39                       } catch (IllegalAccessException e) {
40                           e.printStackTrace();
41                       } catch (ClassNotFoundException e) {
42                           e.printStackTrace();
43                       }
44                   }
45                   return map.get(name);
46      }
47 }
原文地址:https://www.cnblogs.com/newwind/p/5652544.html