单例设计模式
单例设计模式
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为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();// 调用类的静态公共方法,同上
}
}
缺点:
存在线程安全问题。
区别
-
懒汉式和饿汉式的区别,就是什么时候new这个对象。
-
懒汉式,是在第一次有人调用getInstance()方法时来new对象,以后再有人调用getInstance()方法直接就返回之前第一次new好的对象。
-
饿汉式,是在类加载之后,还未被调用的时候,就事先new一个对象。以后无论谁来调用getInsta()方法,都是直接返回之前new好的对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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 中如何实现缓存的预热?