什么是单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。
注意:
- 1、单例类只能有一个实例。
- 2、单例类必须自己创建自己的唯一实例。
- 3、单例类必须给所有其他对象提供这一实例。
单例模式大致分五种创建方式
1.饿汉式
class Instance{
//单例模式:饿汉式 对象无论是否使用都先创建出来
private static Instance is = new Instance();
private Instance() {
}
public static Instance get(){
return is;
}
}
2.懒汉式
class Instance2{
//单例模式:懒汉式 对象先不创建 什么时候使用什么时候创建
//隐患:多线程情况下 可能会有并发问题(可能会同时进入if,有可能创建多个对象)
//解决方案:同步锁
private static Instance2 is ;
private Instance2() {}
public synchronized static Instance2 get(){
if (is==null) is= new Instance2();
return is;
}
}
3.双重检索模式
class Instance2{
//单例模式:懒汉式 对象先不创建 什么时候使用什么时候创建
//隐患:多线程情况下 可能会有并发问题(可能会同时进入if,有可能创建多个对象)
//解决方案:同步锁
private static Instance2 is ;
private Instance2() {}
public synchronized static Instance2 get(){
if (is==null) is= new Instance2();
return is;
}
}
4.静态内部类实现
class Instance4{
//单例模式:静态内部类实现
private Instance4(){}
private static class IN{//静态内部类,优势 使用静态内部类 类加载只做一次 线程安全
private static Instance4 is = new Instance4();
}
public static Instance4 get(){
return IN.is;
}
}
5.枚举实现
num Instance5{
//单例模式:枚举 只要提供一个常量 永远只会调用一次构造
ONE;
private Instance5(){}
public static Instance5 get(){
return ONE;
}
}
单例模式的优缺点:
优点
- 内存中只有一个实例,减少内存开销,尤其是频繁创建和销毁实例时(如管理学院首页页面缓存)。
- 避免资源的多重占用(如写文件操作)。
缺点
- 没有接口,不能继承。
- 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心实例化方式。
注意:在反射情况下,前四种都无法保证单例模式,如果涉及到反序列化创建对象时,可以尝试使用第 5 种枚举方式。