从框架源码学设计模式之单例模式(2)

简介: 从框架源码学设计模式之单例模式(2)

学习设计模式不要死板, 有时候各个设计模式之间没有明显的界限

今天说说我在看框架源码过程中遇到的关于单例模式的设计。

系列问题


1.单例模式


确保全局只有一个实例。减少该类实例的频繁创建,节省资源。

使用场景:

  1. 要求生产唯一序列号。
  2. WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  3. 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

常见使用方式:

  1. 懒汉式,线程不安全版本。 不催不创建实例。
public class Singleton {
    private static Singleton singleton;
    private Singleton() {}
    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}
  1. 懒汉式,线程安全版本。实例创建方法加锁(粗粒度锁)
  2. 懒汉式,双重校验锁版本(安全)。实例创建方法双重校验(锁细化)
  3. 懒汉式,静态内部类(安全)。调用创建方法时,触发类的加载,利用类只会被加载一次这个特性,保证单例。


public class Singleton {
    private Singleton() {}
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}
  1. 饿汉式,静态常量/静态代码块(不如翻译为勤快式),利用类加载时的初始化。static:类变量,总能拿到一个初始化值。final:禁止指令重排;保证必然初始化。
public class Singleton {
    private final static Singleton INSTANCE = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return INSTANCE;
    }
    /*
    private static Singleton instance;
    static {
        instance = new Singleton();
    }
    */
}
  1. 枚举:线程安全。 但是可读性很差。


2.spring 中单例模式


Spring 下默认的 bean 均为 singleton,bean 统一交给容器管理,获取对象从容器里取。

但也有一些不在容器的管理范围的组件。spring 使用了单例模式.


2.1 OrderComparator 比较器

spring 中很多组件都是有顺序的,你也许对@Order 注解很有印象,定义组件的顺序。 OrderComparator 就是那个比较器

来看看源码

public class OrderComparator implements Comparator<Object> {
public static final OrderComparator INSTANCE = new OrderComparator();
...
}


还有他的子类AnnotationAwareOrderComparator

public class AnnotationAwareOrderComparator extends OrderComparator {
 public static final AnnotationAwareOrderComparator INSTANCE = new AnnotationAwareOrderComparator();
}


都是典型的饿汉式。

本文使用 mdnice 排版


相关文章
|
1月前
|
设计模式 存储 SQL
PHP中的设计模式:单例模式的探索
在PHP开发中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。本文将通过一个简单的例子,逐步引导你理解如何在PHP中实现和利用单例模式,以及它在实际项目中的应用价值。
|
7天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
1月前
|
设计模式 存储 负载均衡
【五】设计模式~~~创建型模式~~~单例模式(Java)
文章详细介绍了单例模式(Singleton Pattern),这是一种确保一个类只有一个实例,并提供全局访问点的设计模式。文中通过Windows任务管理器的例子阐述了单例模式的动机,解释了如何通过私有构造函数、静态私有成员变量和公有静态方法实现单例模式。接着,通过负载均衡器的案例展示了单例模式的应用,并讨论了单例模式的优点、缺点以及适用场景。最后,文章还探讨了饿汉式和懒汉式单例的实现方式及其比较。
【五】设计模式~~~创建型模式~~~单例模式(Java)
|
1月前
|
设计模式 存储 缓存
Guava 源码中7种设计模式的实现分析
V 哥在学习 Guava 源码中总结的7个设计模式的实现分析,欢迎关注威哥爱编程,做自己的技术,让别人去卷吧。
|
1月前
|
设计模式 安全 程序员
C#设计模式之单例模式
C#设计模式之单例模式
40 3
|
1月前
|
设计模式 开发框架 API
我们在SqlSugar开发框架中,用到的一些设计模式
我们在SqlSugar开发框架中,用到的一些设计模式
|
30天前
|
设计模式 SQL 缓存
Java编程中的设计模式:单例模式的深入理解与应用
【8月更文挑战第22天】 在Java的世界里,设计模式是构建可维护、可扩展和灵活的软件系统的基石。本文将深入浅出地探讨单例模式这一经典设计模式,揭示其背后的哲学思想,并通过实例演示如何在Java项目中有效运用。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇洞悉软件设计深层逻辑的大门。
26 0
|
1月前
|
设计模式 存储 数据库连接
Python设计模式:巧用元类创建单例模式!
Python设计模式:巧用元类创建单例模式!
32 0
|
1月前
|
设计模式 安全 测试技术
[设计模式]创建型模式-单例模式
[设计模式]创建型模式-单例模式
|
2月前
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
50 6