设计模式详解---单例模式

news2024/11/28 17:56:13

1. 设计模式详解

        单例模式是一种创建对象的设计模式,它确保一个类只有一个实例,并提供全局访问点以获取该实例。

        在单例模式中,类负责创建自己的唯一实例,并确保任何其他对象只能访问该实例。这对于需要共享状态或资源的情况非常有用,例如数据库连接,日志记录器或线程池。

单例模式的主要特点包括:

  1. 私有构造函数:单例类的构造函数被声明为私有,这样其他类无法直接实例化该类。

  2. 静态实例变量:单例类内部维护一个静态实例变量,用于保持对单例实例的引用。

  3. 静态获取方法:单例类提供一个静态方法,以便其他类可以通过该方法获取单例实例。通常,该方法在首次调用时会创建单例实例,并在后续调用时返回该实例。

2.单例模式代码

单例模式实现代码很简单:

/**
 * @Author: stukk
 * @Description: 单例模式
 * @DateTime: 2023-12-17 22:14
 **/
public class Singleton {
    private static Singleton singleton;
    private Singleton(){}

    public static Singleton getInstance() {
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
    public void showMessage(){
        System.out.println("我是单例模式");
    }
}

/**
 * @Author: stukk
 * @Description: 客户端
 * @DateTime: 2023-12-17 22:16
 **/
public class SingletonMode {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.showMessage();
    }
}

 

3. 单例模式的多种实现方式

单例模式有多种形式,每种形式都在实现单例模式的基本原则上略有不同。

3.1. 懒汉式单例模式(Lazy Initialization):

也就是上面展示的代码

特点:在首次调用获取实例的方法时才创建单例实例

优点:延迟实例化,节省资源

缺点:需要考虑线程安全

线程安全版本:

public class LazySingleton {
    private static LazySingleton singleton;
    private LazySingleton(){}

    public static synchronized LazySingleton getInstance() {
        if(singleton == null){
            singleton = new LazySingleton();
        }
        return singleton;
}
3.2. 饿汉式单例模式(Eager Initialization):

特点:在类加载的时候就创建单例实例

优点:简单直接、线程安全

缺点:加载的时候就实例化,可能会实例到不需要使用的类,浪费资源

代码:

/**
 * @Author: stukk
 * @Description: 饿汉式单例模式
 * @DateTime: 2023-12-17 22:31
 **/
public class EagerSingleton {
    private EagerSingleton(){}
    private static EagerSingleton singleton = new EagerSingleton();
    public static EagerSingleton getInstance(){
        return singleton;
    }

    public void showMessage(){
        System.out.println("我是饿汉单例模式");
    }
}

3.3.双重检查锁单例模式(DCL——Double-Checked-Locking)

特点:结合了懒汉式与同步锁机制,在首次调用获取实例的方法式进行双重检查,提高性能。

优点:延迟实例化且线程安全,性能相对较高

缺点:在某些情况下可能还是会出错,比如多线程环境下的指令重排序,会导致不正确的结果。

示例代码:

/**
 * @Author: stukk
 * @Description: 双重检查锁单例模式
 * @DateTime: 2023-12-17 22:41
 **/
public class DCLSingleton {
    private DCLSingleton(){}
    private volatile static DCLSingleton dclSingleton;

    public static DCLSingleton getInstance(){
        if(dclSingleton == null){
            synchronized (DCLSingleton.class){
                if(dclSingleton == null){
                    dclSingleton = new DCLSingleton();
                }
            }
        }
        return dclSingleton;
    }
    public void showMessage(){
        System.out.println("我是双重校验锁单例模式");
    }
}

3.4. 枚举单例模式(Enum)

特点:使用枚举类实现单例,枚举类保证只有一个实例。

优点:简单、线程安全、防止反射和序列化攻击。

示例代码:(这里以计数器为例子)

/**
 * @Author: stukk
 * @Description: 使用枚举实现
 * @DateTime: 2023-12-17 22:46
 **/
public enum EnumSingleton {
    INSTANCE;
//    假设是个计数器
    private int counter;

//    私有构造函数
    private EnumSingleton(){
        counter = 0;
    }

//    获取计数器的值
    public int getCounter(){
        return counter;
    }

//    计数器++
    public void addCounter(){
        counter ++;
    }

//    其他 操作
    public void showMessage(){
        System.out.println("我是枚举单例模式,此时计数器值为:"+getCounter());
    }
}

/**
 * @Author: stukk
 * @Description: 客户端
 * @DateTime: 2023-12-17 22:16
 **/
public class SingletonMode {
    public static void main(String[] args) {
        EnumSingleton singleton = EnumSingleton.INSTANCE;
        singleton.showMessage();
        singleton.addCounter();
        singleton.showMessage();

    }
}

枚举单例模式的使用非常简单,只需要使用枚举类的名称后跟 .INSTANCE 即可获取到单例实例,无需担心线程安全性或其他实现细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1318519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣刷题-二叉树-路径总和

112 路径总和 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树,以及目标和 sum 22, 返回 true, 因为…

2024中国国际大数据产业博览会年度主题征集公告

2024中国国际大数据产业博览会年度主题征集公告 中国国际大数据产业博览会(以下简称数博会),是全球首个以大数据为主题的国家级博览会,由国家发展和改革委员会、工业和信息化部、国家互联网信息办公室和贵州省人民政府共同主办&am…

Android Studio好用的插件推荐

目录 一、插件推荐 二、如何下载 1.点击File—>Settings ​2.点击Plugins然后进行搜索下载 三、Android Studio 模板 一、插件推荐 这个插件可以为您自动生成Parcelable代码。Parcelable是一种用于在Android组件之间传递自定义对象的机制,但手动编写Parcela…

ffmpeg6.0-ffplay.c源码分析(一)之结构体、变量、宏详细解读

ffplay.c在全局定义的结构体、变量、宏就有300多行,去掉空格也有接近300行。 本文从程序相关变量、宏、结构体、全局变量四个方面来解读。 文章目录 程序相关变量宏结构体全局变量关注公众号看全文: 程序相关变量 和程序相关的变量只有两个: const char program_name[]…

常用模块之(time/datetime)

【 一 】时间模块(time/datetime) 【 二 】 表示时间的三种方式 *时间戳(Timestamp)是指1970年1月1日00:00:00开始计算的偏移量。可以使用time模块中的time()函数获取当前时间的时间戳,也可以使用datetime模块中的tim…

ArrayList vs. LinkedList: Java集合框架的比较与应用

目录 1. ArrayList简介 2. LinkedList简介 3. 内部实现方式 3.1 ArrayList的内部实现 3.2 LinkedList的内部实现 4. 时间复杂度比较 4.1 插入和删除操作 4.2 随机访问操作 5. 内存消耗 5.1 ArrayList的内存消耗 5.2 LinkedList的内存消耗 6. 适用场景 6.1 ArrayLi…

【小沐学Python】Python实现通信协议(grpc)

文章目录 1、简介2、安装3、定义接口4、编译生成5、代码编写5.1 服务端5.2 客户端5.3 运行测试 结语 1、简介 https://grpc.io/docs/what-is-grpc/introduction/ https://github.com/grpc/grpc gRPC 是一种现代、开源、高性能的远程过程调用 (RPC) 可以…

LRU 缓存机制_题解(一道经典的数据结构算法题)

LRU 缓存机制_题解(一道经典的数据结构算法题) 146. LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int k…

ADB命令安装卸载手机APP

前言 手机内置的浏览器很多广告,推荐的新闻也很多负面的新闻,所以就想卸载内置的手机app,不过现在很多手机都是限制了内置的软件都不能卸载,以前随便获取一下root权限,也是可以卸载的,不过最近搞了一下&am…

基于YOLOv8深度学习的路面标志线检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

HarmonyOS开发实战:如何实现一个运动排名榜页面

HarmonyOS开发实战:如何实现一个运动排名榜页面 代码仓库: 运动排名榜页面 项目介绍 本项目使用声明式语法和组件化基础知识,搭建一个可刷新的排行榜页面。在排行榜页面中,使用循环渲染控制语法来实现列表数据渲染,…

PyCharm community 安装教程

目录 链接cudatoolkit 下载地址:https://www.jetbrains.com/pycharm/download/other.html 双击打开 安装路径,可自行更换到D盘 不导入设置 链接cudatoolkit

雪花算法(几种常见的雪花算法生成ID方案简单介绍:Hutool、百度Uid-Generator、美团Leaf、Yitter)

文章目录 1.生成id的几种方式2. 雪花算法2.1 雪花算法介绍2.2 市面上几种雪花算法的实现2.2.1 hutool版2.2.1.1 hutool版本雪花算法 关于时钟回拨的处理: ---------------百度UidGenerator 介绍开始--------------2.2.2 百度版:[UidGenerator](https://g…

【动态规划精选题目】2、路径问题模型

此动态规划系列主要讲解大约10个系列【后续持续更新】 本篇讲解路径问题模型中的6道经典题,会在讲解题目同时给出AC代码 目录 1、不同路径 2、不同路径2 3、珠宝的最大价值 4、下降路径最小和 5、最小路径和 6、地下城游戏 1、不同路径 class Solution { publi…

二叉树前,中序推后续_中,后续推前序

文章目录 介绍思路例子 介绍 二叉树是由根、左子树、右子树三部分组成。 二叉树的遍历方式又可以分为前序遍历,中序遍历,后序遍历。 前序遍历:根,左子树,右子树 中序遍历:左子树,根&#xff0…

Tor网络原理详解

引入 匿名通信是一种通过采用数据转发、内容加密、流量混淆等措施来隐藏通信内容及关系的隐私保护技术。为了提高通信的匿名性,这些数据转发链路通常由多跳加密代理服务节点构成,而所有这些节点即构成了匿名通信系统(或称匿名通信网络&#…

ReenterLock重入锁

synchronized就是一种最简单的控制方法,它决定了一个线程释放可以访问临界区资源。 同时,Object.wait()方法和Object.notify()方法起到了线程等待和通知的作用。 ReenterLock重入锁可以完全替代关键字Synchoronized.重入锁是Synchoronized、Object.wait(…

使用podman管理容器

目录 1.安装及配置podman 2.镜像的命名 3.对镜像重新做标签 4.删除镜像 5.查看镜像的层结构 6.导出和导入镜像 7.创建容器 8.创建一个简单的容器 9.容器的生命周期 10.创建临时容器 11.指定容器中运行的命令 12.创建容器时使用变量 对于初学者来说,不太容易理…

深入解析HashMap数据结构及其应用

目录 引言 1. HashMap简介 2. 哈希表的基本原理 3. HashMap的内部结构 4. 哈希冲突的处理 5. HashMap的常见操作 6. HashMap的性能优化 7. 实际应用场景 结论 引言 在计算机科学中,数据结构是构建和组织数据的一种方式,而HashMap是其中一种常用…

TCP单人聊天

TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的通信方式 TCP通信 TCP通信方式呢 主要的通讯方式是一对一的通讯方式,也有着优点和缺点 它的优点对比于UDP来说就是可靠一点 因为它的通讯方式是需…