黑马程序员--java单列设计模式

来源:互联网 发布:空间数据编辑 编辑:程序博客网 时间:2024/05/22 07:40


---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

以下介绍一下单例设计模式:
单例,即单个实例对象。那么单例设计模式:即解决一个类在内存中只存在一个对象。
那么想要保证对象唯一:
    1,为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象。
    2,还为了其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
    3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
那么如何用代码来实现上述思路呢?
    1,禁止其他程序建立该类对象,即将构造函数私有化即可。
    2,在类中创建一个本类对象。
    3,为了使其他对象访问到该自定义对象,可以提供一个方法获取到该对象。
代码实现主要有两种方式:饿汉式,懒汉式。
饿汉式:即先初始化对象。
饿汉式代码实现如下:
class Single
{
  private Single(){} //将构造函数私有化
  static Single s = new Single();  //在本类中自定义一个对象,该s要被静态方法访问到,所以要用static修饰
  public static Single getInstance(){//对外提供一个方法,可以获取对象,
        return s; //另外,不能创建对象,所以必须用类名调用,所以要用static修饰
        }
  }
class SingleDemo
{
    public static void main(String[] args)
  {
        Single ss = Single.getInstance;//这样创建的对象都是同一个对象了。
    }
  }
     懒汉式:即对象是方法被调用时,才初始化,也叫做对象的延时加载。在这里,指的是,single类进内存,          
对象还没有存在,只有调用了getInstance 方法时,才建立对象。
     懒汉式代码实现如下:
  class Single
  {
    private Single(){}
    private static Single s = null;//这里暂时先不创建对象。
    public static Single getInstance()
    {
      if(s==null){
              B-->进来。所以创建的就不是同一个对象了,会出现安全隐患。
              A-->可能等在这。
          s = new Single();
      }
      return s;
    }
  }
但是注意,懒汉式中容易出现安全隐患,所以可以在方法中加一个锁,即synchronized.
即public static synchronized Single getInstance();
然而,加上一个锁之后,程序就变得低效率了。那么应该怎么办呢?
可以进行双重判断。
public static Single getInstance()
{
if (s==null){
      synchronized (Single.class)//静态函数所使用的锁是所在类的字节码文件对象,即类名.class
      {
            if(s==null){
              s= new Single();
            }
        }
  }
}
这样既可以保证不会出现安全隐患,也保证了效率。但是代码有点复杂。
所以,在实际开发过程中,主要还是用饿汉式单例设计模式。


                         ----------------ASP.Net+Unity开发、.Net培训、期待与您交流! --------------
                         详情请查看:www.itheima.com

0 0
原创粉丝点击