李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 系列文章
  • AI工具集
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
白雪成红
惟坚韧者始能遂其志
  1. 首页
  2. 后端
  3. 正文

Java设计模式-单例模式

2020年1月6日 约 961 字4 分钟 178 0 0
合集:Java设计模式第 7 篇 / 共 8 篇
Java›Java设计模式
  1. 1Java设计模式:状态模式
  2. 2Java设计模式:策略模式
  3. 3Java设计模式:模板方法模式
  4. 4JAVA设计模式-抽象工厂模式
  5. 5JAVA设计模式-工厂方法模式
  6. 6Java设计模式-原型模式
  7. 7Java设计模式-单例模式当前
  8. 8设计模式总结

某些系统中为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。

单例模式属于创建型模式,创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。

定义与特点

单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。

在计算机系统中,还有Windows的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。

单例模式有 3 个特点:

  1. 单例类只有一个实例对象;
  2. 该单例对象必须由单例类自行创建;
  3. 单例类对外提供一个访问该单例的全局访问点;

结构

单例模式的主要角色如下:

  • 单例类:包含一个实例且能自行创建这个实例的类。
  • 访问类:使用单例的类。
    Java设计模式-单例模式

实现

饿汉模式:

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

    private HungrySingleton() {
    }

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

懒汉模式:

package com.lifengdi.designpatterns.demo.singleton;

/**
 * 单例模式-懒汉模式
 * 特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例
 * 缺点是每次访问时都要同步,会影响性能,且消耗更多的资源
 *
 * @author 李锋镝
 * @date Create at 11:24 2019/12/12
 */
public class LazySingleton {
    //保证 instance 在所有线程中同步
    private static volatile LazySingleton instance = null;

    //private 避免类在外部被实例化
    private LazySingleton() {
    }

    public static synchronized LazySingleton getInstance() {
        //getInstance 方法前加同步
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

枚举:

package com.lifengdi.designpatterns.demo.singleton;

/**
 * 单例模式-枚举
 * 枚举也是一种特殊的单例模式。可以避免反射、序列化的问题。
 *
 * 反射问题:
 * 懒汉模式和饿汉模式通过私有化构造方法来避免类在外部被实例化,
 * 但是可以通过JAVA的反射机制调用私有构造方法来实例化单例类,所以私有化构造方法并不保险。
 *
 * 序列化问题:
 * 懒汉模式和饿汉模式被序列化前后的对象并不相等(任何一个readObject方法,
 * 不管是显式的还是默认的,它都会返回一个新建的实例,这个新建的实例不同于该类初始化时创建的实例)。
 * 当然这个问题也可以被解决。
 * @author 李锋镝
 * @date Create at 11:36 2019/12/12
 */
public enum EnumSingleton {
    INSTANCE;
    public EnumSingleton getInstance(){
        return INSTANCE;
    }
}
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

Java设计模式-单例模式

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: JAVA 单例模式 设计模式
最后更新:2026年7月14日

岁月同一天 10 月 11 日

回望过去的今天,你在写什么

  • 中间件
    1 年前 2025年10月11日
    Kafka 为什么要抛弃 Zookeeper?

    Kafka 抛弃 Zookeeper(引入 KRaft 模式)是为了解决长期依赖 Zookeeper 带来的性能瓶颈、架…

  • 中间件
    1 年前 2025年10月11日
    高性能场景为什么推荐使用PostgreSQL,而非MySQL?

    在高性能场景(如高并发读写、复杂查询、大数据量存储、多维度数据处理等)中,PostgreSQL 常被优先推荐,核心原因在…

  • 原创
    7 年前 2019年10月11日
    JAVA关键字之volatile关键字说明

    volatile作用 volatile主要是为了解决多线程内存不可见问题。 对于一写多读,是可以解决变量同步问题,但是如…

相关文章
  • Java设计模式:模板方法模式2025年5月21日
  • 解决Intellij IDEA运行报Command line is too long的问题2021年2月18日
  • Spring中@NotNull、@NotBlank、@NotEmpty的区别2019年7月2日
  • Spring Boot 配置加载优先级总结2026年8月6日
  • 记一次Apollo配置中心+Spring配置自动刷新导致的内存泄露问题2026年7月31日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 合集上一篇
合集下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

我亦飘零久,十年来,深恩负尽,死生师友。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
讨论下XXL-JOB GLUE模式的安全问题 心气没了,干什么都不得劲 Kratos-plus v1.1.26版本更新说明 我觉得是时候公布我的导航网站了 代码是 AI 写的,生产事故谁背锅? 给主题增加了游客中心功能
给主题增加了游客中心功能我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能心气没了,干什么都不得劲
零成本玩转 Gemini 3 Pro:普通人的全场景免费使用指南(2025 最新) 博客有logo啦 通俗解释下Spring的Ioc原理 何时重构? 宝塔面板NGINX开启http3 JVM参数中的-D是什么意思
最近评论
老张博客 发布于 14 小时前(10月10日) NAS现在就不要搞了吧,除非你手里有内存和硬盘。
李锋镝 发布于 20 小时前(10月10日) 确实,很多不必要的东西,买了回来也是吃灰……
林羽凡 发布于 23 小时前(10月10日) 一个是不想折腾了,另一个有些觉得没必要的折腾或购买,想想就会算了。
李锋镝 发布于 23 小时前(10月10日) 少年老成吧大概是 :21:
Hary 发布于 24 小时前(10月10日) 我也是这样,感觉都不想折腾了,我还没到中年呢吧啊啊啊
标签聚合
Theme JVM Spring AI IDEA 日常 Redis 架构 数据库 WordPress SpringBoot SQL AI编程 Claude ElasticSearch JAVA 多线程 K8s 分布式 MySQL
友情链接
  • lijie blog
  • 九仞之行
  • 搬砖日记
  • 彬红茶日记
  • 皮皮社
  • Honesty
  • 哥斯拉
  • 林羽凡
  • 知向前端
  • sssr7844的博客
  • Serendipity
  • 老张博客
  • Mr.Sun的博客
  • 韩小韩博客
  • 志文工作室
  • 瓦匠个人小站
  • 懋和道人
  • 韩情脉脉

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com 十年之约虫洞

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号