首页 > 其他分享 >探索设计模式之单例模式:打造独一无二的实例

探索设计模式之单例模式:打造独一无二的实例

时间:2024-04-04 11:59:54浏览次数:25  
标签:Singleton 模式 instance 实例 线程 单例 设计模式

目录

 

1. 什么是单例模式?

2. 单例模式的特点

3. 单例模式的实现方式

3.1 懒汉式:

3.2 饿汉式:

3.3 选择建议

4. 单例模式的应用场景

5. 单例模式的优缺点

6. 总结


 

1. 什么是单例模式?

       单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供全局访问点。

2. 单例模式的特点

  • 独一无二的实例: 单例模式确保一个类只有一个实例对象存在,无论何时何地访问,都返回同一个实例。

  • 全局访问点: 单例模式提供一个全局的访问点,任何地方都可以通过该访问点获取单例实例。

  • 延迟实例化: 单例模式可以实现延迟实例化,即在第一次使用时才创建实例对象,节省资源。

3. 单例模式的实现方式

3.1 懒汉式:

  • 实例化时机: 在第一次使用时才进行实例化,即在 getInstance() 方法中进行实例化。
  • 线程安全性: 懒汉式的简单实现是线程不安全的,在多线程环境下可能会创建多个实例。为了解决这个问题,通常会使用同步锁来保证线程安全性,但这会带来性能损耗。

       一个学生想要去图书馆借书,但并不急着去借书,想在需要的时候再去借。这就好比懒汉式,实例对象在第一次使用时才被创建,延迟加载

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3.2 饿汉式:

  • 实例化时机: 在类加载时就进行实例化,即直接在类定义时就创建了实例对象
  • 线程安全性: 饿汉式天生就是线程安全的,因为在类加载过程中只会执行一次实例化操作,所以不会存在多线程并发访问时创建多个实例的问题。

       一名图书管理员需要在图书馆开门之前将图书架上的书摆好,准备好迎接读者。这就好比饿汉式,实例对象在类加载时就被创建好了,提前加载

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

3.3 选择建议

  • 如果对性能要求较高,可以考虑使用饿汉式,因为它的实现简单且线程安全;
  • 如果需要延迟加载实例并且不太关心性能损耗,可以选择懒汉式,但要注意处理多线程环境下的线程安全问题,可以通过双重检查锁或者静态内部类等方式实现线程安全的懒汉式单例。

4. 单例模式的应用场景

  • 配置对象: 例如全局的配置文件对象,数据库连接池等。

  • 日志对象: 保证系统中只有一个日志实例,方便统一管理日志输出。

  • 线程池对象: 确保线程池只有一个实例,避免资源浪费。

5. 单例模式的优缺点

  • 优点: 节省系统资源、提高系统性能、方便对实例进行管理。

  • 缺点: 可能造成全局变量污染、不易扩展、可能引发线程安全问题。

6. 总结

       单例模式是设计模式中的经典之作,在实际项目中有着广泛的应用。通过合理使用单例模式,可以提高系统的性能和可维护性,同时避免了多次创建相同对象的资源浪费

标签:Singleton,模式,instance,实例,线程,单例,设计模式
From: https://blog.csdn.net/lph159/article/details/137167050

相关文章

  • Mac 系统如何设置L2TP拨号(1),web开发项目实例
    1、任务栏苹果图标里点击“系统偏好设置”;2、在设置选项里点击“网络”;3、点击线路列表下面的“+”号键添加一个网络连接,下图所示:4、设置添加网络类型:接口选中VPN,VPN类型可以选择“PPTP”或“IPSec上的L2TP”,服务器名称可以随意填写一个,然后点击“创建”;5、设置V......
  • MySQL分组查询实例
    数据表创建DDL——学生表——成绩表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTN......
  • 单例设计模式
    概念静态方法和属性的使用设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。类的单例模式就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,且该类只能提供一个取得对象实例的方法。单例模式两种方式饿汉式......
  • R语言广义线性混合模型GLMMs在生态学中应用可视化2实例合集|附数据代码
    全文链接:https://tecdat.cn/?p=35607原文出处:拓端数据部落公众号在生态学研究领域,广义线性混合模型(GeneralizedLinearMixedModels,简称GLMMs)是一种强大的统计工具,能够同时处理固定效应和随机效应,从而更准确地揭示生态系统中复杂关系的本质。随着数据分析技术的不断发展,R语言......
  • 探索设计模式的魅力:AI大模型如何赋能C/S模式,开创服务新纪元
    ​......
  • 实用 Linux 命令 Windos 命令 实例演示 持续更新中
    实用Linux命令Windos命令实例演示持续更新中目录实用Linux命令Windos命令实例演示持续更新中Linux命令【Command[options][local]命令参数路径】命令对照WindowsLinuxLinux命令【Command[options][local]命令参数路径】**对于命令参数记忆......
  • 简单设计模式讲解
    设计模式是在软件开发中经常使用的最佳实践,用于解决在软件设计中经常遇到的问题。它们提供了可重用的设计,使得代码更加灵活、可维护和可扩展。下面我将为你讲解几种常见的设计模式,并提供相应的C#代码示例。 1.单例模式(SingletonPattern)确保一个类仅有一个实例,并提供一个......
  • 反射实例化对象&反射实例化生成工具类
    一,和普通实例化的区别:若有有参构造函数,会自动生成无参构造函数。若无无参构造函数,也会自动生成无参构造函数。相比之下,反射实例化更加灵活。二,该过程会用到大量接口,类:接口回调:类A有实现类B,C,D接口名a=newB;call(a);a=newC;call(a);publicstaticvoidcall(){S......
  • 56.html+css网页设计实例/“家乡”主题上海介绍/web前端期末大作业/
    一、前言  本实例以上海为主题设计,div+css布局,页面简单大气,代码精简,供大家参考。【关注作者|获取更多源码(2000+个Web案例源码)|优质文章】;您的支持是我创作的动力!【点赞收藏博文】,Web开发、课程设计、毕业设计有兴趣的联系我交流分享,3Q!二、网页文件三、网页效果以下......
  • 栈应用-经典实例
    栈的实际应用非常广泛。在回溯问题中,它可以存储访问过的任务或路径、撤销的操作等,还有递归算法也是用的栈结构.之前两篇针对栈的实现用了两个版本,即数组的版本和对象的版本,这里就栈的经典应用举两个实例看看即可.进位制转化括号匹配十进制转二进制我们的日常生活中基......