首页 > 其他分享 >设计模式--单例模式

设计模式--单例模式

时间:2024-01-03 10:00:44浏览次数:29  
标签:-- 创建 模式 实例 线程 单例 设计模式

设计模式--单例模式_初始化

设计模式是软件工程中共同的问题的解决方案,这些方案经过了验证和总结,能够在不同的情境中提供最佳的解决途径。设计模式主要分为三类:创建型模式、结构型模式和行为型模式。以下是这三类模式中的 23 个经典设计模式的列表:

创建型模式(Creational Patterns):

创建型模式涉及对象的初始化和创建过程,它可以使得系统在不需要指定精确类的情况下创建对象。

  1. 单例(Singleton)
  2. 原型(Prototype)
  3. 工厂方法(Factory Method)
  4. 抽象工厂(Abstract Factory)
  5. 建造者(Builder)

结构型模式(Structural Patterns):

结构型模式关注如何组合类和对象以获得更大的结构。

  1. 装饰器(Decorator)
  2. 适配器(Adapter)
  3. 桥接(Bridge)
  4. 组合(Composite)
  5. 外观(Facade)
  6. 享元(Flyweight)
  7. 代理(Proxy)

行为型模式(Behavioral Patterns):

行为型模式关注对象之间的职责分配。它们描述了对象之间的通信及其之间关系。

  1. 责任链(Chain of Responsibility)
  2. 命令(Command)
  3. 解释器(Interpreter)
  4. 迭代器(Iterator)
  5. 中介者(Mediator)
  6. 备忘录(Memento)
  7. 观察者(Observer)
  8. 状态(State)
  9. 策略(Strategy)
  10. 模板方法(Template Method)
  11. 访问者(Visitor)

这些模式是编程经验的晶体,能够帮助程序员避免重复 "重新发明轮子",而是利用已有的设计模式来解决常见问题。了解和掌握这些设计模式可以使设计更加清晰、代码更容易维护和扩展。

单例模式

单例模式分为懒汉模式和饿汉模式;

饿汉:该模式在类被加载时就会实例化一个对象。

该模式能简单快速的创建一个单例对象,而且是线程安全的(只在类加载时才会初始化,以后都不会)。但是它有一个缺点,就是不管你要不要都会直接创建一个对象,会消耗一定的性能(性能几乎可以忽略不计,所有这种模式在很多场合十分常用而且十分简单)。

懒汉:该模式只在你需要对象时才会生成单例模式(比如调用getInstance方法)

单例模式∶使用静态函数,获得对象

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

单例模式的实现

  1. 懒汉式∶ 线程不安全,需要双重加锁(重要) 不使用的时候不占用内存,不是线程安全的 在类加载时不初始化,等待第一次被调用才初始化
  2. 饿汉式∶

    线程安全

    内部唯一的对象是在程序刚运行时进行初始化的。

    可以保证线程安全,缺点是即使不使用也会进行初始化,浪费资源

懒汉模式:懒汉模式指的是单例实例在需要时才被创建。这种模式的关键在于延迟加载,即直到第一次调用 getInstance() 方法时才创建实例。在多线程环境下需要特别小心对实例化过程中的并发访问进行处理,通常需要同步处理。

public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {}  // 私有构造函数

    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();  // 实例在这里创建
        }
        return instance;
    }
}

饿汉模式:相对于懒汉模式,饿汉模式在类加载时就立即创建该类的单例实例。由于类加载在程序开始时就完成了,因此不需要担心多线程问题。这是一个简单且线程安全的实现方式。

public class EagerSingleton {
    // 直接初始化一个实例
    private static final EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {}  // 私有构造函数

    public static EagerSingleton getInstance() {
        return instance; // 直接返回实例
    }
}

标签:--,创建,模式,实例,线程,单例,设计模式
From: https://blog.51cto.com/u_15958702/9078444

相关文章

  • 开源协助平台工程灵活应对多云时代的挑战
    平台工程通过标准化控制和灵活性保障了开发实践。但是,随着平台工程的兴起,开源战略又该如何融入其中呢? 虽然平台工程没有一刀切的方法,但越来越明显的是,开源软件和技术对平台工程的成功绝对至关重要——这一点我将在本文稍后部分详细阐述。首先,让我们迅速深入探讨一下为什么关于平......
  • [EFI]华为 Matebook D14 2020 电脑 Hackintosh 黑苹果efi引导文件
    硬件型号驱动情况主板MatebookD142020处理器 i7-10510U已驱动内存16GBLPDDR32133MHZ已驱动硬盘WDCPCSN73(不支持三星pm981/a)已驱动显卡NVIDIAGeForceMX250/Intel(R)UHD显卡620已驱动声卡瑞昱RealtekALC256@英特尔HighDefinitionAudio控制器已驱动网卡无线......
  • 影响浏览器页面展示的因素以及优化策略
    渲染流水线影响到了首次页面展示的速度,而首次页面展示的速度又直接影响到了用户体验,所以分析渲染流水线的目的就是为了找出一些影响到首屏展示的因素,然后再基于这些因素做一些针对性的调整。那么接下来我们就来看看从发起URL请求开始,到首次显示页面的内容,在视觉上经历的三个阶段......
  • PSoc62™开发板之串口通信
    实验目的1.使用串口和PC机通信:接收和发送信息2.接收GNSS模块定位信息实验准备PSoc62™开发板CH340USB转TTL模块ATGM332DGNSS模块公母头杜邦线x4板载资源板载有多少uart创建工程例程,在libraries/HAL_Drivers/uart_config.h中查看BSP支持的uart数量及对应的GPIO,可以看......
  • Python模块之hashlib模块
    hashlib模块【一】概要hashlib模块是Python中提供对哈希算法的支持的模块。它提供了常见的哈希算法,如MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512,以及一些其他哈希算法。【二】常见用法计算哈希值:hashlib.md5():创建一个MD5哈希对象。hashlib.sha1():创......
  • 面试官:眉毛胡子一把抓,这就是你设计的项目结构
    Java经典项目目录结构大家好,我是JavaPub。很多刚工作的同学进入公司,拿到前辈们写的高级代码,眼前一亮希望可以从里边得到成长。今天和大家聊一聊Java项目目录结构。因为一些原因,我们在学校里学到的知识会滞后一些。但是好在万变不离其宗。接下来这个项目结构可以覆盖绝大......
  • 无涯教程-Java 正则 - X?? 匹配函数
    ReluctantQuantifier[X??]匹配存在一次或根本不存在的X。X??-示例以下示例显示了用法。packagecom.learnfk;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassReluctantQuantifierDemo{privatestaticfinalStringREGEX="T?......
  • IDEA 开发环境配置
    做JAVA开发,现在比做.NET开发更麻烦,光配置一堆环境,几乎就要了亲命。以下是一些常用的操作和工具使用,以及必要配置和查询。现在流行什么前后分离,各种前端框架不停的卷,其实干的事情没有什么差别,反是种种问题越来越多,越做越性能越低。 一.nodejs的安装与配置【下载地址:https......
  • 片上网络相关知识总结
    什么是片上网络片上网络(On-ChipNetwork)是指在集成电路芯片上实现的一种通信网络结构,用于连接芯片上的各个功能模块、处理器核心、存储单元以及其他重要组件。随着芯片上集成度的提高和多核处理器的兴起,片上网络变得愈加重要,因为它在芯片内部提供了高效、低延迟的通信方式。以下......
  • Java之File类的详细解析及小练习
     2.File类2.1概述java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。2.2构造方法publicFile(Stringpathname):通过将给定的路径名字符串转换为抽象路径名来创建新的File实例。publicFile(Stringparent,Stringchild):从父路径名......