当前位置: 首页 > wzjs >正文

做网站公司运营部青岛网站建设定制开发

做网站公司运营部,青岛网站建设定制开发,无锡建设网站公司,wordpress留言板模版单例模式(Singleton Pattern)详解一、单例模式简介 单例模式(Singleton Pattern) 是一种 创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。(对象创建型模式&…

单例模式(Singleton Pattern)详解


一、单例模式简介

单例模式(Singleton Pattern) 是一种 创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。(对象创建型模式)

简单来说,就是:

“在整个应用程序中,某个类只能有一个对象存在。”

这在需要共享资源、统一管理状态或控制访问时非常有用。

在这里插入图片描述
要点
某个类只能有一个实例
必须自行创建这个实例
必须自行向整个系统提供这个实例

单例模式只包含一个单例角色
Singleton(单例)

在这里插入图片描述


私有构造函数
静态私有成员变量(自身类型)
静态公有的工厂方法

二、解决的问题类型

单例模式主要用于解决以下问题:

  • 多个对象造成资源浪费:比如数据库连接池、线程池等,如果每次使用都新建对象,会造成性能浪费。
  • 需要全局唯一访问入口:如配置管理器、日志记录器等,希望整个系统中都通过同一个接口访问。
  • 避免重复初始化带来的错误:例如缓存服务、任务调度器等,不允许多个实例同时运行。

三、使用场景

场景示例
配置中心ConfigManager 管理应用的配置信息
日志记录器Logger 实现统一的日志输出
数据库连接池DataSource 提供连接复用
缓存服务CacheManager 统一管理缓存数据
线程池管理ExecutorService 控制并发资源

四、实际生活案例

想象你在家里只有一台电视遥控器。无论你是爸爸、妈妈还是孩子,大家都必须通过这一个遥控器来操作电视。如果你允许每个家庭成员都拥有自己的遥控器,那么可能会出现混乱操作和资源浪费。

在这个例子中,“遥控器”就是一个“单例”,全家人共享一个实例。


五、代码案例(Java)

1. 懒汉式(线程不安全)

class SingletonLazy {private static SingletonLazy instance;private SingletonLazy() {}public static SingletonLazy getInstance() {if (instance == null) {instance = new SingletonLazy();}return instance;}
}

在这里插入图片描述

⚠️ 注意:这种方式在多线程环境下可能创建多个实例。


2. 懒汉式 + 同步方法(线程安全)

class SingletonLazySync {private static SingletonLazySync instance;private SingletonLazySync() {}public static synchronized SingletonLazySync getInstance() {if (instance == null) {instance = new SingletonLazySync();}return instance;}
}

优点:线程安全
缺点:效率低,每次调用 getInstance() 都会加锁


多个线程同时访问将导致创建多个单例对象!怎么办?👇👇👇

3. 双重检查锁定(Double-Checked Locking)

class SingletonDCL {private static volatile SingletonDCL instance;private SingletonDCL() {}public static SingletonDCL getInstance() {if (instance == null) {synchronized (SingletonDCL.class) {if (instance == null) {instance = new SingletonDCL();}}}return instance;}
}

优点:线程安全、性能较好
推荐方式之一


4. 饿汉式(静态常量)

class SingletonEager {private static final SingletonEager INSTANCE = new SingletonEager();private SingletonEager() {}public static SingletonEager getInstance() {return INSTANCE;}
}

在这里插入图片描述

优点:实现简单、线程安全
缺点:类加载时就初始化,可能造成资源浪费


5. 静态内部类(推荐写法)

class SingletonInnerClass {private SingletonInnerClass() {}private static class SingletonHolder {private static final SingletonInnerClass INSTANCE = new SingletonInnerClass();}public static SingletonInnerClass getInstance() {return SingletonHolder.INSTANCE;}
}

优点:懒加载、线程安全、简洁高效
最推荐写法之一


饿汉式单例类与懒汉式单例类比较

饿汉式单例类:无须考虑多个线程同时访问的问题;调用速度和反应时间优于懒汉式单例;资源利用效率不及懒汉式单例;系统加载时间可能会比较长
懒汉式单例类:实现了延迟加载;必须处理好多个线程同时访问的问题;需通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响

6. 枚举(最佳实践)

enum SingletonEnum {INSTANCE;public void doSomething() {System.out.println("Doing something...");}
}

优点

  • 天然线程安全
  • 天然防止反射攻击
  • 天然支持序列化/反序列化不破坏单例

Joshua Bloch 推荐写法(《Effective Java》作者)


其他案例:

  1. 某软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高了系统的整体处理能力,缩短了响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和请求的分发,否则将会带来服务器状态的不一致以及请求分配冲突等问题。如何确保负载均衡器的唯一性是该软件成功的关键,试使用单例模式设计服务器负载均衡器。
    在这里插入图片描述

  2. 身份证号码:在现实生活中,居民身份证号码具有唯一性,同一个人不允许有多个身份证号码,第一次申请身份证时将给居民分配一个身份证号码,如果之后因为遗失等原因补办时,还是使用原来的身份证号码,不会产生新的号码。现使用单例模式模拟该场景。
    在这里插入图片描述

  3. 打印池:在操作系统中,打印池(Print Spooler)是一个用于管理打印任务的应用程序,通过打印池用户可以删除、中止或者改变打印任务的优先级,在一个系统中只允许运行一个打印池对象,如果重复创建打印池则抛出异常。现使用单例模式来模拟实现打印池的设计。
    在这里插入图片描述

六、优缺点分析

优点描述
节省资源只创建一次实例,避免重复创建销毁带来的性能开销
全局访问提供统一的访问入口,便于集中管理
控制状态一致性避免多个实例导致的数据不一致问题
其他允许可变数目的实例(多例类)
缺点描述
违反单一职责原则单例类通常承担了太多责任,不符合高内聚低耦合原则
不利于测试依赖全局状态,难以进行单元测试
隐藏依赖关系使用单例时不容易看出类之间的依赖关系
扩展困难如果将来需要支持多个实例,重构成本较高
其他由于自动垃圾回收机制,可能会导致共享的单例对象的状态丢失

七、最终小结

单例模式是 Java 开发中最常用的设计模式之一,它的核心思想是:

保证一个类只有一个实例,并提供全局访问入口。

作为一名 Java 开发工程师,掌握单例模式是非常有必要的,尤其是在开发工具类、配置管理器、缓存服务等组件时。

✅ 推荐使用方式总结:

写法是否推荐适用场景
枚举✅✅✅最佳选择,防反射、线程安全
静态内部类✅✅常规项目首选
DCL手动控制懒加载
饿汉式⚠️类加载即初始化,适合简单场景
懒汉式多线程下不安全,慎用

📌 一句话总结:

单例模式就像你家里的“总开关”,不管谁去按,都是控制同一个灯,确保系统的“唯一性”和“一致性”。

如果你正在构建一个需要全局统一管理的组件,不妨考虑使用单例模式。

部分内容由AI大模型生成,注意识别!


文章转载自:

http://oSAKZULR.LfLsq.cn
http://4iERm6gS.LfLsq.cn
http://h9U89lTN.LfLsq.cn
http://qPcGczRr.LfLsq.cn
http://H6RNkYRT.LfLsq.cn
http://foxdj1Ys.LfLsq.cn
http://2bGPScuR.LfLsq.cn
http://mRsr3EiP.LfLsq.cn
http://9fS4KzVD.LfLsq.cn
http://QroXXKny.LfLsq.cn
http://esmRybTw.LfLsq.cn
http://n4rfUQvy.LfLsq.cn
http://cf7RJnwy.LfLsq.cn
http://l5GCFjoN.LfLsq.cn
http://jr4DK8l9.LfLsq.cn
http://PPsMfDA3.LfLsq.cn
http://NIIpVLln.LfLsq.cn
http://VyFLRcyg.LfLsq.cn
http://etPq4xPD.LfLsq.cn
http://TbAZWMHv.LfLsq.cn
http://VOts6t8h.LfLsq.cn
http://kfGLOVTR.LfLsq.cn
http://FzE3Dtuk.LfLsq.cn
http://OFtdDyz9.LfLsq.cn
http://6FGuVez1.LfLsq.cn
http://SbDsMlYQ.LfLsq.cn
http://tNYizcjt.LfLsq.cn
http://yZJ5mAbV.LfLsq.cn
http://S3CSlE10.LfLsq.cn
http://lCyOISLt.LfLsq.cn
http://www.dtcms.com/wzjs/692275.html

相关文章:

  • 个人网站注册平台温州网站建设华一
  • 做二手房网站有哪些wordpress排序优化
  • 同学录网站开发实现基本要求聚名网域名综合查询
  • 南宁做网站培训下载织梦做网站软件
  • 厦门网站制作维护张家港那家做网站
  • 重庆物流公司网站建设listify wordpress
  • 青岛网站建设 新视点制作网站域名需要多少钱
  • 大型网站技术架构 pdf2008系统如何做网站
  • 网站建设公司 经营范围江苏个人网站备案
  • 好的品牌设计网站有哪些公司做网站需要什么内容
  • c 语言能开发做网站吗郑州app外包公司
  • 网站转化怎么做wordpress算前端
  • 网站首页域名有后缀影响搜索吗深圳建筑业网站建设
  • 顺企网吉安网站建设官网铺设
  • 以前做视频的网站哪个在家做兼职网站比较好
  • 湖北建设工程注册中心网站网站浏览构思
  • 个人网站做百度云电影链接犯法吗品牌网站首页怎么设计
  • 网站广告模板代码wordpress page.php
  • 自己建网站写小说可行吗在线制作图片加字合成
  • 网站流量功能更怎么做个体工商户注册公司流程和费用
  • 李继红跪舔坊网站建设什么响应式网站
  • 外国一些做环保袋的网站如何通过ftp上传网站
  • 网站中文域名到期wordpress多站点不显示
  • 怎样给网站做后台四川省住房和城镇建设官方网站
  • 建个什么网站好怎样做网站域名
  • 网站一定备案吗写文章wordpress
  • 戴尔公司网站设计特色wordpress首页不显示指定分类
  • 领诺科技网站建设定制衣服
  • 网站建设蓝色工匠东莞网站推广优化
  • 教人做家务的网站中山网站建设公司哪个好