李锋镝的博客 - LiFengdi.Com

  • 首页
  • 时间轴
  • 留言
  • 左邻右舍
  • 我的日常
  • 关于我
青衿之志 履践致远
霁月光风 不萦于怀
  1. 首页
  2. 原创
  3. 正文

Java设计模式-单例模式

2020年1月6日 10758点热度 0人点赞 0条评论

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

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

定义与特点

单例(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;
    }
}
除非注明,否则均为李锋镝的博客 - LiFengdi.Com原创文章,转载必须以链接形式标明本文链接
本文链接:https://www.lifengdi.com/archives/article/1634
标签: JAVA 单例模式 设计模式
最后更新:2020年1月6日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
0 评论
Inline Feedbacks
查看所有评论
文章目录
  • 定义与特点
  • 结构
  • 实现
网站统计
  • 文章总数:259 篇
  • 评论总数:417 篇
  • 标签数量:218 个
  • 最后更新:2022年5月19日 20:08
  • 建站日期:2016年6月6日
  • 运行天数:2173天

曾经沧海难为水,除却巫山不是云。

最新 热点 随机
最新 热点 随机
jsdelivr的CDN加速好像不行了…… 居家办公了~ Python SQL查询使用动态表名 C# 11 的这个新特性,我愿称之最强! iTerm2设置SSH自动连接服务器 一线技术人的成长思考总结
居家办公了~关于8月29号下午博客故障的一些记录办理居住证困难重重啊!WordPress的自动更新好烦啊醒醒~补个税了居住证签注...
为什么关于香菜的评价这么两极? 中国文学史上最霸气的诗句是哪一首?这首诗当仁不让 数据库事务的一点简单总结 多层嵌套map对象转扁平化map 内存耗尽后Redis会发生什么? ElasticSearch添加mapping
标签聚合
MySQL 架构 日常 ElasticSearch JAVA 数据库 分布式 SpringBoot
最近评论
zenmexiugai 发布于 2 小时前(05月20日) 改成一样的还是报错,怎么回事呢
张三 发布于 9 小时前(05月19日) 我不会css,作者的前端是怎么写的啊?包括这些评论啊什么的
张三 发布于 9 小时前(05月19日) 很棒的博客 作者加油啊
Andy烧麦 发布于 1 天前(05月18日) 将原本的通勤时间拿来学习,还是不错的
傅小黑 发布于 2 天前(05月17日) 居家工作更累
有情链接
  • 志文工作室
  • 临窗旋墨
  • 旧时繁华
  • 城南旧事
  • 强仔博客
  • 林三随笔
  • 徐艺扬的博客
  • 猫鼬的星球计划
  • 云辰博客
  • 韩小韩博客
  • 知向前端
  • 阿誉的博客
  • 林羽凡
  • 情侣头像
  • 哥斯拉
  • Xym's blog

COPYRIGHT © 2022 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备16004681号-2