设计模式-单例模式

20 篇文章 1 订阅
订阅专栏

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

单例模式的定义与特点

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

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

单例模式有 3 个特点:

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

单例模式的结构与实现

单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。

下面来分析其基本结构和实现方法。

1. 单例模式的结构

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

  • 单例类:包含一个实例且能自行创建这个实例的类。
  • 访问类:使用单例的类。


其结构如图 1 所示。

单例模式的结构图
图1 单例模式的结构图

2. 单例模式的实现

Singleton 模式通常有两种实现形式。

第 1 种:懒汉式单例

该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。代码如下:

public class LazySingleton
{
private static volatile LazySingleton instance=null; //保证 instance 在所有线程中同步
private LazySingleton(){} //private 避免类在外部被实例化
public static synchronized LazySingleton getInstance()
{
//getInstance 方法前加同步
if(instance==null)
{
instance=new LazySingleton();
}
return instance;
}
}


注意:如果编写的是多线程程序,则不要删除上例代码中的关键字 volatile 和 synchronized,否则将存在线程非安全的问题。如果不删除这两个关键字就能保证线程安全,但是每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点。

第 2 种:饿汉式单例

该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。

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


饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题。

单例模式的应用实例

【例1】用懒汉式单例模式模拟产生美国当今总统对象。

分析:在每一届任期内,美国的总统只有一人,所以本实例适合用单例模式实现,图 2 所示是用懒汉式单例实现的结构图。
 

美国总统生成器的结构图
图2 美国总统生成器的结构图


程序代码如下:

public class SingletonLazy
{
public static void main(String[] args)
{
President zt1=President.getInstance();
zt1.getName(); //输出总统的名字
President zt2=President.getInstance();
zt2.getName(); //输出总统的名字
if(zt1==zt2)
{
System.out.println("他们是同一人!");
}
else
{
System.out.println("他们不是同一人!");
}
}
}
class President
{
private static volatile President instance=null; //保证instance在所有线程中同步
//private避免类在外部被实例化
private President()
{
System.out.println("产生一个总统!");
}
public static synchronized President getInstance()
{
//在getInstance方法上加同步
if(instance==null)
{
instance=new President();
}
else
{
System.out.println("已经有一个总统,不能产生新总统!");
}
return instance;
}
public void getName()
{
System.out.println("我是美国总统:特朗普。");
}
}


程序运行结果如下:

产生一个总统!
我是美国总统:特朗普。
已经有一个总统,不能产生新总统!
我是美国总统:特朗普。
他们是同一人!


【例2】用饿汉式单例模式模拟产生猪八戒对象。

分析:同上例类似,猪八戒也只有一个,所以本实例同样适合用单例模式实现。本实例由于要显示猪八戒的图像( 点此下载该程序所要显示的猪八戒图片),所以用到了框架窗体 JFrame 组件,这里的猪八戒类是单例类,可以将其定义成面板 JPanel 的子类,里面包含了标签,用于保存猪八戒的图像,客户窗体可以获得猪八戒对象,并显示它。图 3 所示是用饿汉式单例实现的结构图。
 

猪八戒生成器的结构图
图3 猪八戒生成器的结构图


程序代码如下:

import java.awt.*;
import javax.swing.*;
public class SingletonEager
{
public static void main(String[] args)
{
JFrame jf=new JFrame("饿汉单例模式测试");
jf.setLayout(new GridLayout(1,2));
Container contentPane=jf.getContentPane();
Bajie obj1=Bajie.getInstance();
contentPane.add(obj1);
Bajie obj2=Bajie.getInstance();
contentPane.add(obj2);
if(obj1==obj2)
{
System.out.println("他们是同一人!");
}
else
{
System.out.println("他们不是同一人!");
}
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class Bajie extends JPanel
{
private static Bajie instance=new Bajie();
private Bajie()
{
JLabel l1=new JLabel(new ImageIcon("src/Bajie.jpg"));
this.add(l1);
}
public static Bajie getInstance()
{
return instance;
}
}


程序运行结果如图 4 所示。
 

猪八戒生成器的运行结果
图4 猪八戒生成器的运行结果

单例模式的应用场景

前面分析了单例模式的结构与特点,以下是它通常适用的场景的特点。

  • 在应用场景中,某类只要求生成一个对象的时候,如一个班中的班长、每个人的身份证号等。
  • 当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。
  • 当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。

单例模式的扩展

单例模式可扩展为有限的多例(Multitcm)模式,这种模式可生成有限个实例并保存在 ArmyList 中,客户需要时可随机获取,其结构图如图 5 所示。
 

有限的多例模式的结构图
图5 有限的多例模式的结构图

设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例
BADAO_LIUMANG_QIZHI的博客
10-28 975
上面讲了单例模式的三种方式,另外还有一种注册式单例模式
设计模式 - 单例模式
菜鸟小码的博客
08-09 934
单例模式是一种常用的创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这种模式对于那些需要频繁创建和销毁对象的场合非常有用,例如日志记录器、缓存管理器、数据库连接池等。本文将详细介绍单例模式的实现原理,并通过具体的Java代码示例来说明如何实现这一模式。
设计模型之单例模式(含UML完整实例)
atu1111的博客
04-07 5782
设计模型之单例模式 1.单例模式 1.1 定义   单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。   在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序...
Python设计模式 - 单例模式
mofei
05-04 998
单例模式是一种创建型设计模式, 其主要目的是确保一个类只有一个实例, 并提供一个全局访问点来访问该实例。
Java创建型设计模式-单例模式
欢迎拜读我的作品,喜欢的领域请给我留言
08-10 1851
好啦,以上就是关于java设计模式单例模式详细介绍,整理出八种初始化方式及其利弊分析,最佳方式推荐是3.4章节的线程安全单例。
Harmony设计模式-单例模式
不懂先生的博客
06-14 1295
软件设计模式([Design pattern](https://baike.baidu.com/item/Design pattern/10186718?fromModule=lemma_inlink)),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
JAVA设计模式--单例模式
JAVA_SR的博客
09-21 748
单例设计模式
【C++】设计模式-单例模式
Jacky_Feng的博客
07-16 1713
单例模式单例模式(Singleton Pattern)是 一种属于创建型设计模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
ava常用设计模式-单例模式
08-26
ava常用设计模式-单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一...
常见设计模式-单例模式
10-25
设计模式-单例模式 单例模式是一种常见的设计模式,它的主要作用是确保在内存中仅创建一次对象,并提供一个全局访问点。单例模式有两种类型:饿汉类型和懒汉类型。 饿汉类型的单例模式是在类加载时创建对象,例如...
笔记本盖子状态检测GPD Pocket 3自动禁用触摸屏
10-20
GPD Pocket 3如果把合盖动作改成无操作之后,合盖后触摸屏不会自动禁用,然后各种自动乱点,开盖发现打开了一堆乱七八糟的东西,故写了个软件来后台监测盖子的开合状态,并自动启用或禁用触摸屏驱动,以防在合盖后误触。
基于Java和C语言的2023年Arduino重拾项目设计源码
最新发布
10-21
该Arduino重拾项目设计源码基于Java和C语言编写,共包含62个文件,其中Java源文件32个,C头文件12个,Arduino代码文件9个,以及CSV、LICENSE、Markdown、XML等其他类型文件。项目旨在2023年重新探索Arduino编程,适合初学者和中级爱好者。
OCR识别-支持识别80+种语言的算法项目-包括Latin-Chinese-Arabic等等-附详细完整流程教程.zip
10-20
OCR识别_支持识别80+种语言的算法项目_包括Latin_Chinese_Arabic等等_附详细完整流程教程
MyBatis 27道面试题和答案(2025最新版).docx
10-20
MyBatis 27道面试题和答案(2025最新版)
实验九-MATLAB实验SIMULINK仿真.zip
10-20
SIMULINK是一个对动态系统(包括连续系统、离散系统和混合系统)进行建模、仿真和综合分析的集成软件包,是MATLAB的一个附加组件,其特点是模块化操作、易学易用,而且能够使用MATLAB提供的丰富的仿真资源。在 SIMULINK环境中,用户不仅可以观察现实世界中非线性因素和各种随机因素对系统行为的影响,而且也可以在仿真进程中改变感兴趣的参数,实时地观察系统行为的变化。因此SIMULINK已然成为目前控制工程界的通用软件,而且在许多其他的领域,如通信、信号处理、DSP、电力、金融、生物系统等,也获得重要应用。对于信息类专业的学生来说,无论是学习专业课程或者相关课程设计还是在今后的工作中,掌握SIMULINK,就等于是有了一把利器。 本次实验的目的就是通过上机训练,掌握利用SIMULINK对一些工程技术问题(例如数字电路)进行建模、仿真和分析的基本方法。
C#实现的23种设计模式-单例模式解析
"该文档是关于23种经典设计模式的C#版本介绍,主要讨论了其中的一种——单例模式(Singleton Pattern)。" 在软件工程中,设计模式是一种被广泛接受并反复使用的解决方案模板,用于解决常见的设计问题。单例模式是...
写文章

热门文章

  • 应用系统数据对接几种方案 68388
  • Oracle 12c R2 静默安装 39630
  • 挂载文件系统选项nodiratime、noatime 28057
  • sql server 索引超出了数组界限 28021
  • OracleRAC基本概念及入门 24604

分类专栏

  • 大数据 21篇
  • 前端 7篇
  • WebGIS 1篇
  • 数据结构、算法&数学 9篇
  • OS 89篇
  • shell 17篇
  • 软件工程、设计 20篇
  • DB&SQL 70篇
  • 杂谈 22篇
  • HA 24篇
  • 优化 19篇
  • NoSQL 10篇
  • ORACLE 79篇
  • -- Oracle安装配置 10篇
  • -- Oracle BAK&REC 27篇
  • -- Ora12c&13c 15篇
  • -- ORA 37篇
  • PostgreSQL 20篇
  • MySQL 63篇
  • -- MySQL安装配置 15篇
  • -- MySQL BAK&REC 10篇
  • -- MySQL优化 3篇
  • MSSQL 47篇
  • ETL 19篇
  • python 46篇
  • C/C++ 20篇
  • java 70篇
  • Tools 2篇
  • 网络 5篇
  • BI 2篇
  • 目录 3篇

最新评论

  • linux LVM

    CSDN-Ada助手: 如何在 Linux 上设置系统时间?

  • postgres简单安装,配置,简单使用

    CSDN-Ada助手: 大数据包含结构化数据,非结构化数据,半结构化数据,怎么理解结构化?

  • oracle 虚拟索引和不可见索引

    zh______: 你好,请问oracle中怎么查询虚拟索引的大小?

  • sync_relay_log&sync_relay_log_info等参数

    Shark曾_小凡仙: 到底是事件,还是事务? 单位

  • MySQL动态列值转换列名

    kk120120: 好复杂啊!这种动态列名的操作在mysql里实现,实在是有点复杂,得好好考虑下,是人工维护还是用这个动态表情包

大家在看

  • 化学仿真软件:Aspen Plus二次开发_物料与反应物性数据管理
  • 跳表(Skip List)介绍
  • 985研一学习日记 - 2024.10.20
  • 【星闪技术】WS63E模块连接华为IoT云
  • 数据处理和分析之数据聚类:K-means聚类:K-means算法原理与应用 999

最新文章

  • 从二维点集重建平面形状-浅议凹包算法-转
  • UML各种图总结
  • postgresql几何类型和函数
2022年1篇
2021年22篇
2020年82篇
2019年51篇
2018年105篇
2017年205篇
2016年131篇
2015年60篇
2014年36篇
2013年57篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家红色玻璃钢人物雕塑供应商江苏季节性商场美陈售价绍兴抽象玻璃钢雕塑吉林省玻璃钢雕塑定制唐山玻璃钢海豚雕塑天津环保玻璃钢雕塑哪家便宜石碣玻璃钢花盆花器玻璃钢雕塑人物公司人物玻璃钢雕塑定制玻璃钢主题雕塑制作广州玻璃钢犀牛雕塑玻璃钢花盆怎么做的杭州春节商场美陈台州玻璃钢海豚雕塑厂家外贸玻璃钢花盆厂家直销三门峡玻璃钢雕塑价格铁岭玻璃钢座雕塑定制广东玻璃钢花盆采购怀集玻璃钢雕塑价格福州卡通玻璃钢雕塑价格玻璃钢卡通雕塑规格常用指南柳州玻璃钢雕塑用途陕西玻璃钢雕塑市场北京玻璃钢雕塑厂电话玻璃钢做的雕塑有毒吗湖南花钵玻璃钢雕塑定做新密锻铜校园玻璃钢雕塑厂家人物玻璃钢雕塑哪家靠谱金华人物玻璃钢雕塑定制国庆商场美陈布置香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化