一起学Java(三十)----- 单例模式

不积跬步,无以至千里;不积小流,无以成江海。

Java语言基础

Java的单例模式

有时候在整个软件系统中只想存在一个对象实例,那单例设计模式就是针对这种情况的。

如果要让类在一个虚拟机中只能产生一个对象,首先必须将类的构造方法的访问权限设置为private,因为只有这样,就不能进行new操作在类的外部产生类的对象了。但是在类的内部是可以产生该类的对象。因为要在类的外部可以获取到该类的对象,所以必须提供给一个public的方法供外部调用返回该类的对象。但是这个方法要能够直接供外部调用,且要在不产生该类对象的情况下,所以这个方法必须定为public static。由于静态方法只能访问类中的静态成员变量,所以该类对象的变量也必须定为静态的。

三个步骤:

  • 私有化构造函数:
public class Singleton {
	private Singleton() {
		// TODO Auto-generated constructor stub
	}
}
  • 提供一个方法给外部调用获取该类的对象,这个方法必须为public权限,且为静态方法:
public class Singleton {
	private Singleton() {
		// TODO Auto-generated constructor stub
	}
	public static Singleton getSingleton() {		
		return singleobject;		
	}
}
  • 在该类内中创建该类的对象,因为要供静态方法访问,所以该变量也必须为静态变量,且要为私有的,否则可以供外部调用:
public class Singleton {
	
	private Singleton() {
		// TODO Auto-generated constructor stub
	}
	
	private static Singleton singleobject = new Singleton();
	
	public static Singleton getSingleton() {		
		return singleobject;		
	}
}

完成上边步骤后,就已经是产生唯一一个对象了。外部直接调用Singleton.getSingleton()方法就可以获得Singleton的对象。

上面的是饿汉式,典型的空间换时间,当类加载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要判断了,节省了运行时间。

再看懒汉式,体现了缓存的思想,一开始不要加载资源或者数据,一直等到马上就要使用这个资源的或者数据,才去加载。懒汉式是定性的时间换空间,不加同步的懒汉式是线程不安全的,加上关键字sychronized:

public class Singleton {
	
	private Singleton() {
		// TODO Auto-generated constructor stub
	}
	
	private static Singleton singleobject = null;
	
	public synchronized static Singleton getSingleton() {
		
		if (singleobject == null) {
			singleobject = new Singleton();
		}
		return singleobject;		
	}
}

  

博客借鉴:https://baijiahao.baidu.com/s?id=1638292042203351778&wfr=spider&for=pc

猜你喜欢

转载自www.cnblogs.com/smilexuezi/p/12652533.html