单例模式
单例模式是最简单,但也是比较常用的模式之一。
单例模式:确保一个类只有一个实例对象,并提供一个全局访问点。
有一些类的实例对象,我们只需要一个,比如说:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机、显卡等设备的驱动程序的对象。事实上,这些类的对象有且只能有一个实例对象,如果制造出多个实例对象,就会导致许多的
问题产生。例如:程序的行为异常,资源使用过量,或者是不一致的结果。
单例模式的核心思想就一条:将构造器私有化,通过类的静态方法返回唯一的类的实例对象。
立即加载实例的形式:
1 /** 2 * 单例模式的立即加载模式 3 * @author wly 4 * 5 */ 6 public class RightNowGetInstance { 7 //只要这个类 被加载 就获得这个类的是一个实例对象 8 private static RightNowGetInstance rn = new RightNowGetInstance(); 9 //将构造器私有化 其他类不能通过 new来调用这个构造器 10 private RightNowGetInstance() 11 { 12 13 } 14 //通过静态方法 返回这个类的唯一的实例对象 15 public static RightNowGetInstance getInstance() 16 { 17 return rn; 18 } 19 }
延迟加载实例的形式:
1 /** 2 * 单例模式的 延迟加载模式 3 * @author wly 4 * 5 */ 6 public class DelayGetInstance { 7 //声明一个变量 用来引用 将要产生的唯一的实例对象 8 private static DelayGetInstance dgi; 9 //将构造器私有化 其他类不能通过new来调用这个构造器 来产生实例对象 10 private DelayGetInstance() 11 { 12 13 } 14 //通过静态方法 返回这个类的唯一的实例对象 15 //synchronized关键字 迫使每条线程进入这个方法之前必须等到别的线程离开该方法,也就是说不能有两条线程同时进入这个方法 16 public static synchronized DelayGetInstance getInstance() 17 { 18 if(dgi == null) //dgi为空 ,表示还没有一个实例对象 new一个实例对象返回 19 { //dgi不为空 ,表示前面已经创建了一个实例对象 ,直接返回前面创建的实例对象 20 dgi = new DelayGetInstance(); 21 } 22 return dgi; 23 } 24 }