在 Java 中应用设计模式 -- Singleton [转载】

AI系统架构原理与代码实战案例讲解 人工智能的概念可以追溯到上世纪50年代,图灵测试的提出标志着人工智能作为一门学科的诞生。早期的研究主要集中在符号推理、专家系统等领域,取得了一些突破,例如机器定理证明、西洋跳棋程序等。上世纪80年代,随着专家系统的兴起,人工智能进入了一个黄金时期。专家系统通过模拟人类专家的知识和经验进行推理和决策,在医疗诊断、故障诊断等领域取得了成功应用。进入90年代,由于计算能力的限制和数据量的不足,人工智能的发展陷入低谷。近年来,随着深度学习技术的突破、大数据的兴起以及计算能力的提升,人工智能迎来了第三次发展浪潮,在图 阅读详情

转载:http://www.ibm.com/developerworks/cn/java/designpattern/singleton/

 

 

 

基本概念

Singleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能有一个连接的存在.再举个例子,集合中的 set 中不能包含重复的元素,添加到set里的对象必须是唯一的,如果重复的值添加到 set,它只接受一个实例.JDK中正式运用了Singleton模式来实现 set 的这一特性,大家可以查看java.util.Collections里的内部静态类SingletonSet的原代码.其实Singleton是最简单但也是应用最广泛的模式之一,在 JDK 中随处可见.

简单分析

为了实现 Singleton 模式,我们需要的是一个静态的变量,能够在不创建对象的情况下记忆是否已经产生过实例了.静态变量或静态方法都可以在不产生具体实例的情况下直接调用,这样的变量或方法不会因为类的实例化而有所改变.在图1的结构中可以看到,uniqueInstance 就是这个独立的静态变量,它可以记忆对象是否已经实例化了,在静态方法 Instance 中对这个变量进行判断,若没有实例化过就产生一个新的对象,如果已经实例化了则不再产生新的对象,仍然返回以前产生的实例.


图1: Singleton 模式结构
图1: Singleton 模式结构 

具体实施

实现 Singleton 模式的办法通常有三种.

一. 用静态方法实现 Singleton 这种方法是使用静态方法来监视实例的创建.为了防止创建一个以上的实例,我们最好把构造器声明为 private.

这样可以防止客户程序员通过除由我们提供的方法之外的任意方式来创建一个实例,如果不把构造器声明为private,编译器就会自作聪明的自动同步一个默认的friendly构造器.这种实现方法是最常见的,也就是图1中结构的标准实现.

public class Singleton {  
  private static Singleton s; 
  private Singleton(){};
  /**
   * Class method to access the singleton instance of the class.
   */
  public static Singleton getInstance() {
    if (s == null)
      s = new Singleton();
    return s;
  }
}
// 测试类
class singletonTest {
  public static void main(String[] args) {
    Singleton s1 = Singleton.getInstance();
    Singleton s2 = Singleton.getInstance();
    if (s1==s2)
      System.out.println("s1 is the same instance with s2");
    else
      System.out.println("s1 is not the same instance with s2");
  }
}

singletonTest运行结果是:

s1 is the same instance with s2

这证明我们只创建了一个实例.

二. 以静态变量为标志实现 Singleton 在类中嵌入一个静态变量做为标志,每次都在进入构造器的时候进行检查.

问题在于构造器没有返回类型,如果确定创建一个实例成功与否.一个方法是调用一个函数来检查创建是否成功,然后简单的返回一个来自静态变量的值,但是这样做是不优雅的,而且容易发生错误.比较好的做法是创建一个当创建了一个以上的实例时可以抛出异常的类,这个类仅仅是调用父类方法,好处是用了自己命名的异常类型,错误信息更加清晰:

class SingletonException extends RuntimeException {
  public SingletonException(String s) {
    super(s);
  }
}
class Singleton {
  static boolean instance_flag = false; // true if 1 instance
  public Singleton() {
    if (instance_flag)
      throw new SingletonException("Only one instance allowed");
    else
      instance_flag = true; // set flag for 1 instance
  }
}
// 测试类
public class singletonTest {
  static public void main(String argv[]) {
    Singleton s1, s2;
    // create one incetance--this should always work
    System.out.println("Creating one instance");
    try {
      s1 = new Singleton();
    } catch (SingletonException e) {
      System.out.println(e.getMessage());
    }
    // try to create another spooler --should fail
    System.out.println("Creating two instance");
    try {
      s2 = new Singleton();
    } catch (SingletonException e) {
      System.out.println(e.getMessage());
    }
  }
}

singletonTest运行结果是:

Creating one instance

Creating two instance

Only one instance allowed

可以看出,第一个实例顺利创建,第二个实例创建实抛出了我们自定义的异常.

三. 用注册器机制来创建 Singleton 首先用集合中的Hashtable 和Enumeration来实现addItem(Object key, Object value),getItem(Object key), ,removeItem(Object key)等方法实现一个管理器,将key和value一一关联起来,客户程序员创建实例前首先用addItem方法进行注册,再用getItem方法获取实例.Hashtable中的key是唯一的,从而保证创建的实例是唯一的,具体实现限于篇幅不再细说,在Prototype模型的应用一文中我将会给出一个实现注册器的代码.用注册器机制来创建 Singleton模式的好处是易于管理,可以同时控制多个不同类型的Singleton 实例.

小结

 

  1. Singleton模式可以方便的进行扩充,产生指定数目的实例.
  2. 在The Design Patterns Java Companion 一书中曾提到过用静态类的方式来实现 Singleton模式,并指出java.lang.Math就是一个例子,这里我并不表示赞同,因为Math并不是一个真正的对象,我们只是直接调用Math类所包装的静态方法而已,根本就没有创建实例的过程,又从何说起只产生一个实例呢?这个问题我曾到Javaranch的论坛上发过帖子,所有回帖的人也都是对这一观点持否定态度.
  3. 在多线程的程序中,singleton可能会变的不可靠,可能会出现多个实例,解决的办法很简单,加个同步修饰符: public static synchronized Singleton getInstance(). 这样就保证了线程的安全性.
  4. 最后要说的是大家可能会看见一些其他实现Singleton模式的方法,因为模式在具体的应用时是灵活的,不是一成不变的,并没有一个固定的做法,但大都是上面几种方法的变形.

 


参考资料

  • Thinking in Java -- Bruce Eckel
  • Design Patterns in Java -- Bob Tarr
  • The Design Patterns Java Companion -- James W.Copper
  • Design Patterns -- Gang of Four
  • Singletons Are Evil -- http://c2.com/cgi/wiki?SingletonsAreEvil
  • Singletons Are Good -- http://c2.com/cgi/wiki?SingletonsAreGood 
  • When is a singleton not a singleton? -- http://www.javaworld.com/javaworld/jw-01-2001/jw-0112-singleton-2.html
  • The forum of JavaRanch Big Saloon --http://www.javaranch.com/cgi-bin/ubb/forumdisplay.cgi?action=topics&forum=OO,+Patterns,+UML+and+Refactoring&number=9

 

日常工作记录---在虚拟机中进行slam建图    今天是10月24号,首先祝各位程序员们节日快乐!!!    最近一周由于实习的原因,对ROS的探索学习,停滞了一段时间,所以今天也就没什么大的进展,本篇文章仅仅记录一下,我在虚拟机中进行slam建图可行性验证的过程,本篇文章同样使用古月学院《如何在Gazebo中实现阿克曼转向车的仿真》的课程资料来进行验证    下面各条之间并没有严格的顺序关系,每一条都是独立的,都是我在验证过程中的经验或者记录:    1、在运行roslaunch bringup racecar_gazebo_rviz.lau 阅读详情

相关推荐

SRAM:SRAM入门指南与工作原理

SRAM(Static Random Access Memory),即静态随机存取存储器,是一种能够读取和写入数据的内存(RAM)。它使用由晶体管组成的触发器来存储数据,只要有电源供应,数据就可以稳定地保存。与动态随机存取存储器(DRAM)不同,SRAM 不需要周期性地刷新来保持数据。

weixin_42896509的博客 1万+

【从零开始学习JAVA | 第二十三篇】集合体系结构

JAVA中为我们提供了很多集合,这些集合都有自己很独特的特点,因此我们要学习所有的集合,但是在学习所有的集合之前,我们还是先为大家介绍一下JAVA的集合体系结构,这样有利于大家更好的理解整个JAVA集合框架。

fckbb的博客 1968

深入浅出:利用NXP S32K3xx的HSE模块实现OTA双分区(AB Swap)与安全回滚

本文深入解析NXP S32K3xx HSE模块在汽车电子OTA双分区架构中的工程实践,详细介绍了HSE模块如何通过AB Swap双分区机制实现固件安全升级与毫秒级回滚。内容涵盖内存重映射硬件原理、分区切换异常处理及寄存器级诊断方法,为开发高可靠嵌入式系统提供实战指导。

weixin_30919429的博客 793

Java Collections singleton()方法与示例

集合类singleton()方法 (Collections Class singleton() method) singleton() method is available in java.util package. singleton()方法在java.util包中可用。 singleton() method is used to return an immutable set [i.e. ...

1万+

Postman账号

Postman账号一、为什么要注册一个Postm账号二、如何注册Postman账号三、登录账号四、切换账号五、找回账号密码 一、为什么要注册一个Postm账号 注册Postman账号是免费的。当注册并登录一个Postman账号后,用户可以获得一下权限。 (1)同步和备份历史、集合、环境和预置头。 (2)可以轻松处理来自不同机器的多个Postman实例‘ (3)创建集合链接发送给其他开发人员。 当然,不注册也可以使用Postman。 二、如何注册Postman账号 (1)下载、安装Postman应用程序。 (

精益求精,永无止境,永远在路上! 6773

避开这些坑!baostock获取股票数据时最容易犯的5个错误(Python实战)

本文针对使用Python和baostock库获取股票历史数据时常见的五大陷阱,提供了实战解决方案。重点剖析了登录状态验证、参数配置、数据解析、批量操作效率及数据一致性校验等关键环节,帮助开发者构建稳健高效的数据获取流程,避免因细节疏忽导致的数据错误或性能瓶颈。

websocket5live的博客 1440

在Java中应用设计模式之Singleton

基本概念    ingleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点。正在装载数据……对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能有一个连接的存在。    再举个例子,集合中的 set 中不能包含重复的元素,添加

meteorWJ's Home—Floating clound 845

Claude Code 完整学习笔记

Claude Code 学习笔记摘要 Claude Code是Anthropic推出的智能编码工具,基于Claude Opus 4.5模型构建,提供跨平台支持(终端/VS Code/JetBrains/Web等)。核心功能包括: 代码库理解与多文件编辑 命令执行与开发工具集成 智能体协作开发流程 安装要求Node.js≥18,提供原生/Homebrew/npm等多种安装方式,支持环境变量配置API访问。基础交互模式包括会话管理、文件操作和代码审查等功能,可自动读写文件并执行精确修改。 (149字)

虚心若愚 810

Java单例模式Singleton

Singleton是一种创建性模型,它确保只产生一个实例,并提供一个访问它的全局访问点,对于有些类来说,确保只有一个实例是很重要的,比如有的时候数据库的连接、Socket连接要受到一定的限制,必须确保同一时间只有一个连接的存在。再举个例子,集合中的set中不能包含重复的元素,添加到set里的对象必须是唯一的,如果重复的添加到set,它只接受一个实例,JDK中正式运用了Singleton模式来实现s

liujiegood10136的专栏 586

AAC编解码器在实时通信中的性能对比与应用选择

本文深入分析了AAC编解码器在实时通信中的性能优化,重点对比了faac、faad2与fdk-aac三大开源方案在WebRTC场景下的表现。通过实测数据揭示其在延迟、音质和资源消耗等关键指标的差异,并提供场景化选型建议与调优技巧,帮助开发者提升实时音视频通信质量。

weixin_29210727的博客 388

用 CDS 作为 Referenced Data Source 开发 SAP Gateway OData 服务,一条更轻的 SEGW 路线

本文介绍了SAP Gateway项目中从传统手工建模到基于CDS View的现代化开发方式转变。主要内容包括: 传统方式需要在SEGW中手动创建Entity Type、Entity Set等元素,并在DPC_EXT中编写大量查询逻辑,存在模型层和业务逻辑重复表达的问题。 7.50版本后,SAP Gateway与ABAP CDS深度集成,可通过SEGW直接引用CDS View作为数据源,自动生成数据模型和SADL读取逻辑,支持完整的OData查询功能。 最佳实践建议通过Consumption View而非直接

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 703

[从零开始学习JAVA ] 集合体系结构

TreeMap是通过红黑树实现的。

2301_80615512的博客 1600

EMB电子机械制动器夹紧力预估策略分析

本文探讨了电子机械制动器(EMB)夹紧力的四种预估方法:1)基于电机电流的方法简单经济但易受干扰;2)基于位置传感器的方法实时性好但依赖模型精度;3)直接力测量精度最高但成本较高;同时提出未来将结合AI和数字孪生技术提升预估精度。研究显示,准确的夹紧力预估对制动安全性、能效和舒适性至关重要,当前面临温度稳定性、参数漂移等技术挑战。随着智能算法的发展,EMB夹紧力预估将实现更高精度和可靠性。

m0_59012156的博客 850

请不要滥用设计模式——SingleTon篇_转载

前言 说到面向对象的设计模式,现在很多人都可以随便说出好几种常用的,但是有没有想过设计模式,即使是初学者也至少能说一下SingleTon和Factory Method这两个。 那么,设计模式是不是随便怎么用都没问题哪? 这个问题从提问的方式上就可以看出,答案一定是否定的(大家也不是白白接受了这么多年的应试教育的)。 但是,就我个人的观察,滥用设...

diehuang2868的博客 122

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java设计模式之singleton模式编程

【需求说明】:请编写一个Singleton模式的程序【需求分析】:Singleton模式的主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录数据库连接都需要这样的单线程操作。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收。一般Singleton模式通常的形式为:定义一个类,它的构造函数为priv...

dianmo9374的博客 236

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

转载:23种设计模式整理(很全)

23 种设计模式汇集 目录 文章目录23 种设计模式汇集目录设计模式引言学习 GoF 设计模式的重要性建筑和软件中模式之异同设计模式之 Singleton(单态)模式实战书籍《Java 实用系统开发指南》单态定义:设计模式之 Factory工厂模式定义*:*提供创建对象的接口*.* 为何使用*?*工厂模式中有: 工厂方法*(Factory Method)* 抽象工厂*(Abstract Factory).*设计模式之 Builder设计模式之 Prototype(原型)设计模式之 Adapter(适配器)设

qq_46120580的博客 2258

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

用Java实现Singleton模式

用Java实现Singleton模式 剑指Offer-面试题2:实现一个类,我们只能生成该类的的一个实例 用私有构造器或者枚举类型强化Singleton属性1 实现Singleton有两种常见方法。这两种方法都要保持构造器为私有的,并导出共有静态成员,以便允许客户端能够访问该类的卫衣实例。 在第一种方法中,公有静态成员是个final域: public class Elvis{ publi...

qq_41913807的博客 2054

Java设计模式—单例设计模式(Singleton Pattern)完全解析

认真做好每一件自己下定决心要做的事。

乐于分享,乐于讨论,欢迎大家积极讨论 3万+

Java设计模式之Singleton模式

转载:http://www.svn8.com/java/sjms/20100320/26911.html Java设计模式之Singleton模式   Java Singleton 模式用来保证在运行的应用程序中,一个Class只是实例化一次,也就是只有一个相应的对象存在。在 web 程序中我们会用一个核心的分配功能的Servlet程序,在这里我们就可以运用这种设计模式了。   一般Sin...

iteye_18761的博客 176

Singleton设计模式活学活用: 请求单一 vs 线程单一

Singleton设计模式活学活用: 请求单一 vs 线程单一 /// <summary> /// 在Web Request期间只存在唯一实例的类 /// 使用了Lazy /// </summary> ...

alieen_941124的博客 143

JAVA中Singleton的用法

Java Singleton模式属于管理实例化过程的设计模式家族。Singleton是一个无法实例化的对象。这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例。 JAVASingleton模式属于管理实例化过程的设计模式家族。Singleton是一个无法实例化的对象。这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例。如果实例不存...

weixin_30483013的博客 166

[转载]设计模式之Singleton(单态)

设计模式之Singleton(单态)单态定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。还 有, singlet...

congji3817的博客 92

Java Singleton类中的线程安全性的示例代码

  Java Singleton类中的线程安全性的示例代码   Singleton是最广泛使用的创建设计模式之一,用于限制应用程序创建对象。在实际应用程序中,数据库连接或企业信息系统(EIS)等资源是有限的,应该明智地使用以避免任何资源紧缩。为此,我们可以实现Singleton设计模式来创建围绕资源的包装类,并将在运行时创建的对象数限制为一个。   Java中的线程安全单例 一般来说...

YunWisdom 346

JAVA设计模式系列之Singleton模式(转载)

单态定义: Singleton模式主要作用是确保在Java应用程式中,一个类Class只有一个实例存在。 在非常多操作中,比如建立目录 数据库连接都需要这样的单线程操作。 更有, singleton能够被状态化; 这样,多个单态类在一起就能作为一个状态仓库相同向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且...

Gooleyeah的博客 160

Java-单例模式(singleton)-转载

概念:  java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。  单例模式有一下特点:  1、单例类只能有一个实例。  2、单例类必须自己自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的...

Dominic0112的博客 94

设计模式之Singleton(单态)

设计模式之Singleton(单态) 板桥里人 http://www.jdon.com 2002/05/07 模式实战书籍《Java实用系统开发指南》 单态定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操...

109
上一篇: 设计模式 不错的blog
下一篇: 在 Java 中应用设计模式 - Factory Method
gl7788521
博客等级 码龄17年 5粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值