设计模式-单例 Singleton

简介: 设计模式-单例 Singleton

场景:重量级的对象,不需要多个实例,如线程池、数据库连接池

单一职责:一个类和方法只做一件事。

开闭原则:对修改关闭,对扩展开发。

里氏替换原则:子类可扩展新方法,但尽量不要重写父类已有方法(注意是尽量而非绝对不可,实际中重写父类方法还是很常见的),避免多态调用时出现程序错误。

依赖倒置:依赖于抽象,而非具体实现,即面向接口编程(如方法参数,类属性使用接口声明,这样可接收任何子类)。

接口隔离:一个接口只干一件事,降低功能耦合。

最少知道/迪米特原则:降低类之间的依赖,聚合,组合等。

懒汉(延迟加载)

public class Mgr03 {
    private static Mgr03 INSTANCE;
    private Mgr03(){
    }
    //在调用时才初始化,同步代码块来增加效率
    public synchronized static Mgr03 getInstance(){
        if (INSTANCE == null){
            INSTANCE = new Mgr03();
        }
        return INSTANCE;
    }
}

因为有加锁,所以这个时候会出现性能的问题,于是可以引入双重检索的机制缩小同步代码块

public class Mgr06 {
    private static Mgr06 INSTANCE;
    private Mgr06(){
    }
    //在调用时才初始化,同步代码块来增加效率
    public  static Mgr06 getInstance(){
        //可以解决已经初始化了还有线程进来的问题
        if (INSTANCE == null){
            //锁在里面,线程可能会同时进到这里
            synchronized(Mgr06.class){
                //双重检索
                if (INSTANCE == null){
                    INSTANCE = new Mgr06();
                }
            }
        }
        return INSTANCE;
    }
}

也可以用静态内部类来实现,利用JVM保证线程安全的问题,静态内部类持有对象,只会加载初始化一次

public class Mgr07 {
    private Mgr07(){
    }
    
    public Mgr07 getInstance (){
        return Mgr07Holder.INSTANCE;
    }
    private static class Mgr07Holder{
        private static final Mgr07 INSTANCE = new Mgr07();
    }
}

最好的办法就是使用枚举,可以解决反射的问题

public enum Mgr08 {
    INSTANCE;
    public void m(){}
}

饿汉(立即加载)

类加载到内存后,就实例化一个单例,jvm保证线程安全

public class Mgr01 {
    private static final Mgr01 INSTANCE = new Mgr01();
    //单例最重要的一点,私有化构造函数,不让外面的人调用
    private Mgr01(){
    }
    public static Mgr01 getInstance(){
        return INSTANCE;
    }
}

最简单也是最常用的方法。设计模式的核心是考虑设计,而不是考虑各种极端的场景

目录
相关文章
|
7月前
|
设计模式
单例设计模式步骤
单例设计模式步骤
35 1
|
7月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
150 0
|
7月前
|
设计模式 安全 Java
在Java中即指单例设计模式
在Java中即指单例设计模式
41 0
|
26天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
29 2
|
3月前
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
设计模式——设计模式介绍和单例设计模式
|
3月前
|
设计模式 安全 Java
设计模式--单例模式Singleton
这篇文章详细介绍了单例模式Singleton的八种实现方式,包括饿汉式(静态常量和静态代码块)、懒汉式(线程不安全和线程安全的同步方法、同步代码块)、双重检查、静态内部类和枚举。每种方式都有详细的代码示例和优缺点说明,帮助理解单例模式的应用和选择适合的实现方法。
设计模式--单例模式Singleton
|
7月前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
4月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
65 1
|
4月前
|
设计模式 Java
【Java】单例设计模式
【Java】单例设计模式
|
6月前
|
设计模式 Java 编译器
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)