单例设计模式

单例设计模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

特点:

  • 有且仅有一个实例化对象,也就是说只会new一次对象。

单例设计模式—饿汉模式

示例

Single.java

/*
 * 实现一个饿汉式的单例
 * 
 */
public class Single {
	// 私有构造

	// 私有构造,构造方法私有化,调用这个类就不能用new来创建对象
	private Single() {
	}

	// 私有的静态singlemodel对象
	private static Single singlemodel = new Single();
	// 私有的类变量只创建一个对象,以后调用对象都是该对象

	public static Single getInstance()
	// 静态返回Single类型的方法 调用singlemodel对象
	{
		return singlemodel;
	}
}

T1.java 测试文件

public class T1 {
	public static void main(String[] args) {

		Single a = Single.getInstance(); // 调用实例化对象
		Single a1 = Single.getInstance(); // 调用实例化对象
		Single a2 = Single.getInstance(); // 调用实例化对象
		Single a3 = Single.getInstance(); // 调用实例化对象
		// 对象只创建一个, 无论调用多少次都是同一个对象
	}
}

单例设计模式—懒汉模式

示例

Single2.java

/*
 * 
 * 实现懒汉式单例模式
 * 
 */
public class Single2 {

	// 先私有话构造方法,无法让外部类直接new对象
	private Single2() {
	}

	// 静态类变量。一次赋值,共享使用。
	private static Single2 single2 = null;

	/*
	 * 在第一次调用Single2.getInstance()方法时创建对象
	 */

	public static Single2 getInstance() {
		// 判断对象是否实例化,并返回实例化对象
		if (single2 == null) {
			single2 = new Single2();
		}
		return single2;
	}
}

T2.java 测试文件

public class T2 {
	public static void main(String[] args) {

		Single2 b = Single2.getInstance();// 调用类的静态公共方法,并实例化对象
		Single2 b1 = Single2.getInstance();// 调用类的静态公共方法,使用以实例化的对象
		Single2 b2 = Single2.getInstance();// 调用类的静态公共方法,同上
	}
}

缺点:

存在线程安全问题。

区别

  1. 懒汉式和饿汉式的区别,就是什么时候new这个对象。

  2. 懒汉式,是在第一次有人调用getInstance()方法时来new对象,以后再有人调用getInstance()方法直接就返回之前第一次new好的对象。

  3. 饿汉式,是在类加载之后,还未被调用的时候,就事先new一个对象。以后无论谁来调用getInsta()方法,都是直接返回之前new好的对象。

posted @ 2021-07-11 14:45  Gonfei  阅读(37)  评论(0)    收藏  举报