浅析单例设计模式

来源:互联网 发布:access数据库 工具 编辑:程序博客网 时间:2024/06/03 20:39


在实际应用中可能会遇到需要保存某个类在内存中的对象唯一性,比

如web中多个程序使用同一个配置文件,此时就需要满足以上要求,

这种设计模式成为单例设计模式。

如何保证对象的唯一性呢?
1.不允许使用new关键字进行创建对象
2.在该类中创建唯一实例
3.向外暴露一个共有的静态方法,以便得到该对象

具体步骤:
1.私有化该类的构造函数以便满足上述条件1
2.使用new关键字在该类中创建唯一对象
3.定义一个公有的方法将创建的对象返回

单例设计模式有以下两种实现方法:

package singlePattern;

//饿汉式   在class文件加载进方法区是就在静态区创建该对象
class Wife{
 private static Wife w = new Wife();
 
 private Wife(){}
 
 /*
  * 添加static修饰符是因为其他程序必须通过类名去访问该公共方法
  * 所以必须是静态的
  */
 public static Wife getInstance(){
  return w;
 }
}

//懒汉式
 //在class文件加载时并没有进行该对象创建,只有在第一次调用getInstance时才会创建
 //延迟加载
class Wife1{
 private static Wife1 w = null;
 
 private Wife1(){}
 
 //使用synchronized关键字修饰是为了保证同步,即线程安全
 public synchronized static Wife1 getInstance(){
  if(w != null)
   w = new Wife1();
  return w;
 }
}


//测试类

package singlePattern;

public class Husband {
 public static void main(String[] args) {
  /*
   * 有人可能有疑问为什么不能直接使用类名进行调用(如下所示,该实例没有被private修饰符修饰时)
   * 这样也可以保证唯一性,而且不需要再去向外暴露一个公有函数。
   *
   * 使用上面所述的3步创建方法是为了具有更好的可控性
   * 例如有时候可能在判断一定条件之后才会允许其他程序调用该唯一实例
   * 而这些条件就可以通过参数传递在函数中进行验证
   */
//  Wife w1 = Wife.w;
  
  Wife w2 = Wife.getInstance();
  Wife w3 = Wife.getInstance();
  System.out.println(w3==w2);//true
  
  Wife1 w4 = Wife1.getInstance();
  Wife1 w5 = Wife1.getInstance();
  System.out.println(w4==w5);//true
 }
}
就饿汉式进行内存分析:
1.Husband类文件加载入方法区
2.main函数进入虚拟机栈
3.在局部变量表里边创建Wife w2引用类型变量
4.在Wife.getInstance()时,Wife的class文件进入方法区
5.在静态区创建唯一实例的引用 Wife w = null;
6.在Java堆中创建唯一实例 new Wife(),并将其地址赋值给步骤5中的w
7.Wife.getInstance()方法将得到该实例的地址
8.即w2指向该实例
9.由于w2和w3指向同一片内存区域,所以输出结果为true


0 0
原创粉丝点击