单例设计模式

来源:互联网 发布:java程序用什么编写 编辑:程序博客网 时间:2024/06/03 08:10

单例设计模式
问题:
可以保证一个类在内存里面的对象的唯一性
例子:
现在有a程序,b程序,有一些配置信息。现在要把这些信息分装到对象里面去。a现在要操作这些配置信息,现在操作完成以后,还必须在b程序重新建立一个新的对象的时候就已经知道,配置信息中的某些变量或是其他数据已经被改变了
实现:
<1>如果采用全静态的话,就会导致对象的生命周期过长
<2>实现过程:
a.不允许其他部分的程序用new创建对象,这样可以保证不用new创建更多的对象,私有化该类的构造函数
b.在该类中创建一个本类实例,通过new在本类中创建一个本类的对象
c.对外提供一个方法让其他程序可以获取该对象,定义一个公有的方法将创建的对象返回
示例代码:
1.饿汉式

class Single{    private static Single s = new Single();   //在类中建立一个私有的本类的对象    private Single() {}   //建立一个私有的构造函数,防止别的类new新的对象    public static  Single getIntance()    {        return s;    }    //提供对外进行访问的方法}

随着类的加载,对象就已经存在了,被称为懒汉式

2.懒汉式
可以更加的减少对内存的占用(延迟加载形式)
示例代码:

class Single{   private static Single2 s = null;   //将你的本类对象设置为空,以便于后面进行再加载   private Single2() {}   //设置私有构造函数防止被其他的方法重新建立对象   public static Single2 getIntance()   {      if(s == null)         s = new Single2();      return s;    }    //做的是一个对象有没有被创建的判断}        

这个是只有你真正需要这个对象的时候,对象才会被创建,这样的话会减少内存空间的消耗


在开发中使用上一种名叫“饿汉式”的开发模式,原因是不管你是提前加载还是后加载,终归都要进行加载,否则你这个设计模式就没有意义,而且使用后一种“懒汉式”在多线程开发的时候,容易导致类的对象不唯一

3.2.在多线程中的单例设计模式
判断多线程的访问问题:
是不是创建多个对象
是不是共享数据
在单例设计模式中是存在这样的问题的
示例代码:

class Single2{    private static  Single2 s = null;    private Single2()    {}    public static synchronized Single2 getIntence()    {        if( s == null)          s =   new Single2();        return s;    }}//加了同步之后就不会继续产生有可能新创建对象的事情

在这个地方使用同步函数每次都要重复的判断锁,效率比较低

4.使用同步代码块的放大来使单例设计模式同步提高效率
示例代码:

class Single2{    private static  Single2 s = null;    private Single2()    {}    public static  Single2 getIntence()    {        if(s == null)        {           synchronized(Single2.class)           {              if( s == null)              s = new Single2();        }        }        return s;    }}

在函数体中使用了两次判断的目的就是,第一次线程进入使用了锁,然后失去了执行权,接着第二个线程进入,一看锁已经被使用就不再进入,等轮到第一个线程继续执行的时候,再把锁交还回来,减少判断次数