设计模式:单例模式懒汉式与饿汉式的区别

  在单例模式中,一个类只允许有一个实例对象。之前的理解是用户自觉遵守一个类只创建一个实例对象的规则,其实这是错误的,单例模式中,会给类做一些特殊处理,使得用户只能得到一个该类的实例对象。用户是无法获取第二个实例对象的。

其中又有懒汉式和饿汉式,下面简单说一下两种方式的区别。

  懒汉式:

  (1):将类的构造器声明为私有化,这就使得外部无法通过构造函数创建这个类的对象了。那么如何创建这个类的唯一那个对象呢?

  (2):在该类中声明一个静态的私有的该类的变量。不初始化,或初始化为null,这是懒汉式的特点。

  (3):为该类创建一个对外公共的静态的方法访问该变量,如果该变量为null,创建它。

public class Test
{
  private static Test t = null;     //初始化为Null
  
  private Test() //将构造器声明为private很关键
  {
  }
  public static Test getTest()
  {
    if(null = t){           //对象为null,则创建一个
	  t = new Test();
	}
	return t;      //返回创建好的唯一该类对象
  }
}

饿汉式:

  

(1):将类的构造器声明为私有化,这就使得外部无法通过构造函数创建这个类的对象了。

  (2):在该类中声明一个静态的私有的该类的变量。并初始化它,这是饿汉式的特点。

  (3):为该类创建一个对外公共的静态的方法访问该变量。

public class Test
{
  private static Test t = new Test();  //在声明的同时初始化,创建一个实例
  
  private Test() //将构造器声明为private很关键
  {
  }
  public static Test getTest()
  {
	return t;      //返回创建好的唯一该类对象
  }
}

  这种创建方法并不是最佳的,因为有时就算不需要用到t对象,而需要用到Test类其他方法时t对象也会创建出来,这是因为成员变量在类加载时一定会被初始化。

  最佳方法是:将这个成员的声明放到内部类中去:

public class Test
{
  private static class createTest
  {
    private static Test t = new Test();
  }
  
  private Test() //将构造器声明为private很关键
  {
  }
  public static Test getTest()
  {
	return createTest.t;      //返回创建好的唯一该类对象
  }
}

  由于类只有在使用到的时候才加载,这样只有真正需要这个Test对象t时,调用getTest方法,这个内部类才被加载,t才被创建。而用到Test类其他方法时,这个内部类并不会被加载,t对象也就没有被创建。这样减少无用对象的产生。







猜你喜欢

转载自blog.csdn.net/xlantian/article/details/80963640