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 }
研究技术需要静下心来,一点一点地深究.......