黑马程序员--------单例设计模式

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一.      为什么要使用单例设计模式?

可以保证一个类在内存中的对象唯一性。

比如,程序读取一个配置文件的时候,就可以把配置为文件封装成对象。当要求方便的操作其中的数据,又要保证多个程序读到的是同一个配置文件对象,就需要这个配置文件对象在内存中是唯一的

二.      怎样保证对象唯一性呢?

思路:

1.      让本类的构造函数私有化,这样其他的类就不可以创建本类对象。

2.      在本类中创建一个私有的本类对象。

3.      对外提供方法,让其他的类可以获取这个对象。

3.      单例设计模式的分类:

单例设计模式有两种,一种是懒汉设计模式(又称为延迟加载设计模式),一种是饿汉设计模式。

饿汉设计模式的代码体现如下:

class Single
{
 
       //私有本类中的构造函数
 
       private Single(){}
 
       //创建本类对象
 
       private static Single s= new Single();
 
       //对外提供获取本来对象方法
 
       public static Single getInstance()
       {
 
              return s;
 
       }
}
注意问题:

  由于外界无法创建Single对象,没有对象,那就无法调用getInstance方法,这时需要将getInstance方法静态化,这样外界就可以通过类名直接调用该方法。

懒汉模式:

public class SingleDemo

{
      public static voidmain(String[] args)
      {
              //获取Single类的实例对象s
              Single s = Single.getInstance();

              //获取Single类的实例对象s2
              Single s2 = Single.getInstance();
              System.out.println(s==s2); //true
      }
}

class Single
{
      //私有构造函数
      private Single(){}

      //在本类中创建本类对象
      private static Single instance = null;

      //对外提供静态访问方法,获取本类实例对象
      public static Single getInstance()
      {
              if(instance == null ) // 这里会有线程安全问题
              {
                      instance = new Single();
              }
              return instance;
      }
 
}

三,总结:

懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。

饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。

从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式

在并发的情况下,懒汉式是不安全的。如果两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。

四,懒汉设计模式缺陷的解决方案:

我们可以使用线程锁来解决这个问题,代码反映如下:

class Single
{
      //私有构造函数
      private Single(){}

      //在本类中创建本类对象
      private static Single instance = null;

      //对外提供静态访问方法,获取本类实例对象
      public static Single getInstance()
      {
    	  if(instance == null)
    	  {
	    	  synchronized(Single.class)
	    	  {
	              if(instance == null )
	              {
	                      instance = new Single();
	              }
	    	  }
    	  } 
    	  return instance;
      }
 
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值