单例设计模式

单例设计模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为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 @   Gonfei  阅读(34)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示