【GoF23种设计模式】02_单例模式(Singleton Pattern)

ops/2024/12/19 3:00:10/

文章目录


前言

提示:设计者模式有利于提高开发者的编程效率和代码质量:

GoF(Gang of Four,四人帮)设计模式由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者合著,介绍了23种经典的设计模式
分为三大类:创建型模式、结构型模式和行为型模式。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是单例模式

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取这个实例。这通常用于需要集中控制或管理资源的场景,例如数据库连接、线程池、配置文件读取等。

二、为什么要用单例模式

使用单例模式的原因包括但不限于以下几点:

  • 资源控制:确保系统中某个资源仅有一个实例,避免资源浪费或冲突。
  • 全局访问:提供一个全局访问点,使得系统中的任何部分都可以方便地访问该实例。
  • 节省内存:因为只有一个实例存在,所以可以节省系统资源,特别是当对象占用大量内存时。
  • 状态共享:对于需要在多个地方共享状态的情况,单例模式可以确保状态的一致性。
  • 初始化成本高:如果对象的创建过程非常复杂或者耗时,那么使用单例模式可以在第一次使用时才进行创建,从而延迟初始化,提高性能。

三、如何实现单例模式

单例模式的实现有多种方式,下面是一些常见的实现方法:

1、懒汉式(Lazy Initialization)
懒汉式是在第一次调用 getInstance 方法时才创建实例,这样可以实现延迟加载,节省资源。

java">public class Singleton {private static Singleton instance;private Singleton() {} // 私有构造函数防止外部实例化public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

优点:实现了真正的懒加载,即只有在真正需要的时候才会创建实例。

缺点:每次调用 getInstance 方法都需要进行同步,这可能会带来性能问题。

2、饿汉式(Eager Initialization)
饿汉式是在类加载时就创建实例,因此不需要同步,性能较好。

java">public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {} // 私有构造函数防止外部实例化public static Singleton getInstance() {return instance;}
}

优点:没有线程安全问题,也不需要同步,性能较高。

缺点:无论是否使用,都会创建实例,无法实现懒加载。

3、双重检查锁定(Double-Checked Locking)
双重检查锁定是一种优化过的懒汉式实现,减少了不必要的同步操作,提高了性能。

java">public class Singleton {private static volatile Singleton instance;private Singleton() {} // 私有构造函数防止外部实例化public static Singleton getInstance() {if (instance == null) { // 第一次检查synchronized (Singleton.class) {if (instance == null) { // 第二次检查instance = new Singleton();}}}return instance;}
}

优点:既实现了懒加载,又避免了每次调用 getInstance 时都进行同步,性能较高。

缺点:实现稍微复杂一些,而且需要理解Java内存模型和volatile关键字的作用。

4、静态内部类(Static Inner Class)
静态内部类是另一种实现懒加载的方式,利用了类加载机制确保线程安全。(常用)

java">public class Singleton {private Singleton() {} // 私有构造函数防止外部实例化private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

优点:线程安全,且实现了懒加载,性能良好,代码简洁。

缺点:与其它方式相比,可能不是最直观的理解方式。


总结

选择哪种实现方式取决于具体的应用场景和需求,后期会新增关于单例模式的具体应用场景。


http://www.ppmy.cn/ops/143058.html

相关文章

APP测试中ios和androis的区别,有哪些注意点

一、运行机制不同 IOS采用的是沙盒运行机制,安卓采用的是虚拟机运行机制。 1、沙盒机制: 概念:沙盒是一种安全机制,用于防止不同应用之间互相访问 作用:就是存储数据,每个沙盒就相当于每个每个应用的系…

从〇开始深度学习(1)——PyTorch - Python Deep Learning Neural Network API

从〇开始深度学习(1)——PyTorch - Python Deep Learning Neural Network API 文章目录 从〇开始深度学习(1)——PyTorch - Python Deep Learning Neural Network API<零>写在前面<壹>Part 1: Tensors and Operations1.Section 1: Introducing PyTorch1.1.PyTorch …

vulnhub靶场【shenron】之3

前言 靶机&#xff1a;shenron-3 攻击&#xff1a;kali 都采用虚拟机&#xff0c;网卡为桥接模式 主机发现 使用arp-scan -l或者netdiscover -r 192.168.1.1/24即可 信息收集 使用nmap扫描端口 网站探测 访问网站&#xff0c;发现可能是wordpress&#xff0c;而且经过前…

Python 写的《桌面时钟》屏保

原代码&#xff1a; # 日历式时钟 # 导入所需的库 # 作者&#xff1a;Hoye # 日期&#xff1a;2024年12月16日 # 功能&#xff1a;显示当前日期、星期、时间&#xff0c;并显示模拟时钟 import tkinter as tk from tkinter import ttk import time import math import sysdef …

OpenAI直播发布第6天:ChatGPT视频聊天、屏幕共享和圣诞语音包!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

社交电商新风口:短视频交友+自营商城源码运营

创新运营中&#xff0c;将短视频交友与自营商城源码融合&#xff0c;确实是一个引领潮流的举措。这种融合不仅为用户提供了一个既能交友互动又能购物的综合性平台&#xff0c;还通过丰富的功能和先进的技术手段&#xff0c;提升了用户体验&#xff0c;增加了用户粘性。以下是对…

Ubuntu环境中安装docker

安装依赖sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release添加阿里云GPG秘钥curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -设置stable仓库sudo add-apt-repository "deb [archamd…

C++打地鼠游戏一小时极限开发

视频&#xff1a;【课设拯救计划/直播回放】C打地鼠游戏一小时极限开发&#xff08;完整版&#xff09;_哔哩哔哩_bilibili 创建几个全局变量&#xff1a; IMAGE img_menuBackground; //主菜单背景图 IMAGE img_mole; //地鼠图片 IMAGE img_empty; //坑位图片 IMAGE im…