【设计模式】2、设计模式分类和单例设计模式

简介: 【设计模式】2、设计模式分类和单例设计模式

一、设计模式的分类

key value
创建型(五种) ① 单例、② 抽象工厂、③ 原型、④ 建造者、⑤ 工厂
结构型(七种) ① 适配器、② 桥接、③ 装饰、④ 组合、⑤ 外观、⑥ 享元、⑦ 代理
行为型(十一种) 模板方法、命令、访问者、迭代器、观察者、中介者、备忘录、解释器、状态、策略、责任链

☃️ 创建型:强调在程序中创建对象时如何设计

☃️ 结构型:强调如何保证软件结构的扩展性和更合理的结构性

☃️ 行为型:强调如何提高方法的重用性,以及如何合理地抽取可复用的代码

二、介绍单例

☃️ Singleton Pattern:如果一个类被设计成单例设计模式,则在整个应用程序运行过程中,该类只能存在一个实例

☃️ 优点:节省系统资源(避免哪些创建开销大,且相同的对象被多次创建)

☃️ MyBatis 中的 SqlSessionFactory 的实现类(SqlSessionManager)就是单例设计模式

MyBatis 中的单例设计模式:

/**
 * @author Larry Meadors
 */
public class SqlSessionManager implements SqlSessionFactory, SqlSession { 
    private final SqlSessionFactory sqlSessionFactory;
    // 构造方法私有化
    private SqlSessionManager(SqlSessionFactory sqlSessionFactory) {
         
    }
    public static SqlSessionManager newInstance(Reader reader) {
        return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, null, null));
    }
    public static SqlSessionManager newInstance(Reader reader, String environment) {
        return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, environment, null));
    } 
    public static SqlSessionManager newInstance(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionManager(sqlSessionFactory);
    }
}

三、饿汉式(静态常量)☆

🍎 类变量在程序运行过程中只占用一份固定的内存(存储在方法区

/**
 * 单例模式饿汉式(静态变量)
 */
public class Singleton1 {
    // static final 常量在程序运行过程中只有一份固定的内存
    // 静态变量在类加载的时候被初始化(不存在多线程的情况)
    // 且类仅被加载一次
    private static final Singleton1 INSTANCE = new Singleton1();
    /**
     * 构造方法私有化
     */
    private Singleton1() {
        System.out.println("1 private Singleton1()");
    }
    /**
     * 返回 JVM 内存中 Singleton1 的唯一实例
     */
    public static Singleton1 getInstance() {
        System.out.println("2 public static Singleton1 getInstance()");
        return INSTANCE;
    }
}

🍎 线程安全

🍎 无法实现懒加载,会有内存浪费情况出现


四、饿汉式(静态代码块)

/**
 * 单例模式饿汉式(静态代码块)
 */
public class Singleton2 {
    private static final Singleton2 INSTANCE;
    // 静态初始化块, 当类第一次被使用的时候会执行一次静态初始化块里面的代码
    static {
        System.out.println("1 static{}");
        INSTANCE = new Singleton2();
    }
    private Singleton2() {
        System.out.println("2 private Singleton2()");
    }
    public static Singleton2 getInstance() {
        return INSTANCE;
    }
}

🍎 线程安全

🍎 无法实现懒加载,会有内存浪费情况出现


五、懒汉式(线程不安全)

/**
 * 单例设计模式懒汉式(线程不安全)
 */
public class Singleton3 {
    private static Singleton3 instance;
    private Singleton3() {
    }
    public static Singleton3 getInstance() {
        if (instance == null) { // 懒加载(线程不安全)
            instance = new Singleton3();
        }
        return instance;
    }
}


六、懒汉式(同步方法 - 线程安全)

/**
 * 单例设计模式懒汉式(同步方法 - 线程安全)
 */
public class Singleton4 {
    private static Singleton4 instance;
    private Singleton4() {
    }
    /**
     * 加锁(synchronized): 线程安全
     */
    public static synchronized Singleton4 getInstance() {
        if (instance == null) {
            instance = new Singleton4();
        }
        return instance;
    }
}

📝 优点:懒加载(不消耗内存且线程安全)

📝 缺点:加锁🔒导致性能降低


七、单例模式双层检查 ☆☆☆

/**
 * 单例模式双重检查
 */
public class Singleton5 {
    private static volatile Singleton5 instance;
    private Singleton5() {
    }
    public static Singleton5 getInstance() {
        if (instance == null) {
            synchronized (Singleton5.class) {
                if (instance == null) {
                    instance = new Singleton5();
                }
            }
        }
        return instance;
    }
}

八、单例模式(静态内部类)☆☆☆☆☆

/**
 * 单例模式静态内部类
 */
public class Singleton6 {
    private Singleton6() {
    }
    private static class Singleton6Holder {
        private static final Singleton6 INSTANCE = new Singleton6();
    }
    public Singleton6 getInstance() {
        return Singleton6Holder.INSTANCE;
    }
}

九、单例模式 - 枚举

/**
 * 单例模式 - 枚举
 */
public enum SingletonEnum {
    INSTANCE
}
相关文章
|
7月前
|
设计模式
单例设计模式步骤
单例设计模式步骤
35 1
|
7月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
150 0
|
7月前
|
设计模式 Java
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
59 2
|
7月前
|
设计模式 安全 Java
在Java中即指单例设计模式
在Java中即指单例设计模式
41 0
|
25天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
29 2
|
3月前
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
设计模式——设计模式介绍和单例设计模式
|
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 编译器
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)