设计模式之代理模式
今天,我们将深入讨论Java中的设计模式之一——单例模式。单例模式为我们的代码注入了一种独特的力量,确保一个类只有一个实例存在。让我们一起揭开这个设计模式的神秘面纱,看看它是如何在Java中展现其力量的。
1. 什么是单例模式?
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种类型的设计模式属于创建型模式,因为它提供了一种在创建对象时处理对象创建的最佳方式。
2. 为何使用单例模式?
-
资源共享: 单例模式可以避免多次创建相同对象,节省系统资源。
-
全局访问点: 通过单例模式,我们可以在程序的任何地方访问实例,方便地共享数据和状态。
-
延迟实例化: 单例模式允许在需要时才创建实例,而不是在程序启动时就创建,从而提高性能。
3. Java中的单例模式
在Java中,实现单例模式有几种常见的方式,包括饿汉式、懒汉式、双重检查锁等。
3.1 饿汉式
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
3.2 懒汉式
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
妄图通过减小同步代码块的方式提高效率,但是不可行
会有多个线程进入if语句,等待创建实例
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
3.3 双重检查锁
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
3.4 静态内部类
完美的写法 JVM保证单例 加载外部类时不会加载内部类,这样可以实现懒加载
public class Singleton {
private Singleton() {}
private static class SingletonHolder{
private final static Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
3.5 枚举类
不仅可以解决线程同步,还可以防止反序列化。
public enum Singleton {
/**
* 单例实例
*/
INSTANCE;
......
}
// 使用
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(() -> System.out.println(Mgr08.INSTANCE.hashCode())).start();
}
}
4. 示例演示
让我们通过一个简单的例子来演示单例模式的应用。假设我们有一个日志记录器类,我们希望在整个应用程序中只有一个日志记录器实例。
public class Logger {
private static Logger instance;
private Logger() {}
public static synchronized Logger getInstance() {
if (instance == null) {
instance = new Logger();
}
return instance;
}
public void log(String message) {
System.out.println("Log: " + message);
}
}
5. 结语
单例模式是一种在许多Java应用程序中广泛使用的设计模式,它确保了程序中只有一个实例,从而带来许多优势。希望通过本文,你对Java中的单例模式有了更深入的了解。
如果你对其他设计模式或Java的任何主题有兴趣,也欢迎在评论区留言,我们将为你提供更多深度的解析。感谢阅读,下期再见!
希望这篇推文对你有所帮助!如果有其他问题或需要进一步解释,请随时提问。
评论区