单例模式

79 阅读2分钟

什么是单例模式

单例模式(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 种枚举方式。