目 录CONTENT

文章目录

设计模式之单例模式

在等晚風吹
2023-12-12 / 0 评论 / 0 点赞 / 14 阅读 / 0 字 / 正在检测是否收录...

设计模式之代理模式

今天,我们将深入讨论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的任何主题有兴趣,也欢迎在评论区留言,我们将为你提供更多深度的解析。感谢阅读,下期再见!


希望这篇推文对你有所帮助!如果有其他问题或需要进一步解释,请随时提问。

0

评论区