介绍

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在

  许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

For example,就是一个王国(Kingdom)里,应该只有一位国王(King),每次调用国王就应该是同一个国王。

基本的实现思路

对于一个类,每次都只有一个实例,这个就要确保单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。

单例的实现主要是通过以下两个步骤:

  • 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;
  • 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

常见的实现方式

1 饿汉式

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

当然了,这个也可以写一个静态代码块。

2 懒汉式(双重检查)

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

  

3 静态内部类

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

这种方式跟饿汉式方式采用的机制类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方在饿汉式方式是只要Singleton类被装载就会实例化,没有Lazy-Loading的作用,而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。

  类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。

  优点:避免了线程不安全,延迟加载,效率高。

4 枚举

public enum Singleton {INSTANCE;public void whateverMethod() {}
}

借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。可能是因为枚举在JDK1.5中才添加,所以在实际项目开发中,很少见人这么写过。

优点

  系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。

缺点

  当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new,可能会给其他开发人员造成困扰,特别是看不到源码的时候。

适用场合

  1. 需要频繁的进行创建和销毁的对象;
  2. 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
  3. 工具类对象;
  4. 频繁访问数据库或文件的对象。

转载于:https://www.cnblogs.com/Cyning/p/3663044.html

[Java设计模式]单例模式相关推荐

  1. Java 设计模式 - 单例模式

    Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录 Java 设计模式 - 单例模式 单例设计模式介绍 单例设计模式八种方式 饿汉式 - 静态常量 饿汉式( ...

  2. Java设计模式——单例模式

    单例模式 1.什么是单例模式. 2.单例设计的几种实现方式. 2.1.懒汉式 2.2.饿汉式 2.3.登记式 3.总结 4.建议 1.什么是单例模式. 确保某一个类只有一个实例,并且提供一个全局访问点 ...

  3. Java设计模式——单例模式的七种写法

    单例模式(Singleton) 单例模式(Singleton)是一种常用的设计模式.在Java应用中,单例模式能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

  4. JAVA设计模式--单例模式

    Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例设计模式的类的 ...

  5. 我的Java设计模式-单例模式

    就算不懂设计模式的兄弟姐妹们,想必也听说过单例模式,并且在项目中也会用上.但是,真正理解和熟悉单例模式的人有几个呢?接下来我们一起来学习设计模式中最简单的模式之一--单例模式 一.为什么叫单例模式? ...

  6. JAVA设计模式 - 单例模式

    单例模式(Singleton)是软件设计中一种比较常见的 , 相对简单的设计模式 . 1 . 单例模式的定义 所谓单例 , 指的就是单示例 , 即某个类的实现对象有且仅能有一个 , 并提供对外调用的方 ...

  7. java设计模式—单例模式

    (一)单例模式  java中一共有23种设计模式 : 是开发人员根据不同的代码场景总结出来的不同的实现方法, 归纳为23种代码的设计方法, 单例模式就是其中的一种. 单例模式 : 在整个系统中,一个类 ...

  8. 【文末抽书】Java设计模式--单例模式

    来源 :投稿 | 作者 : gyl-coder|原文:阅读原文 在介绍单例模式之前,我们先了解一下,什么是设计模式? 设计模式(Design Pattern):是一套被反复使用,多数人知晓的,经过分类 ...

  9. java设计模式---单例模式

    关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便萌生了写这篇文章的念头.企图 ...

  10. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

最新文章

  1. 页面与ViewModel(上)
  2. shell脚本常用命令
  3. 转 C#对多个集合和数组的操作(合并,去重,判断)
  4. aix 超过一天的文件_Aix 6.1下 /dev/null 21 文件过大导致根目录爆满
  5. 人工蜂群算法python_改进的人工蜂群算法解决聚类问题(在Python中的分步实现)...
  6. 使用阿里云服务器(OOS)实现图片上传
  7. easyui更换主题之后出现validatebox的验证提示信息显示跑偏的解决方案
  8. parse data from Nacos error
  9. java sequence 生成器_分布式高效唯一ID生成器(sequence)
  10. 小米手机怎么删除桌面计算机,手机桌面图标怎么删除,小米手机怎样删除桌面图标-...
  11. 【工科数学分析】2021-10-01-工科数学分析叒复习(一)
  12. 最全的国内外电子书籍网站合集
  13. 区块链智能合约----Solidity状态修饰符view、pure
  14. 清洁机器人--屏幕显示LCD方案接口说明概述
  15. python连接sap接口_基于Python的SAP流程自动化
  16. java:编写一个求平方的窗体
  17. Mybatis一对多和多对一联系处理
  18. js中向数组中添加元素unshift() 方法
  19. 腾讯最难lua面试题答案及解析
  20. maven的wagon-maven-plugin插件详解

热门文章

  1. dot watch+vs code提升asp.net core开发效率
  2. 使用ILSpy软件反编译.Net应用程序的方法及注意事项
  3. 转:前端js、jQuery实现日期格式化、字符串格式化
  4. VS模板导入导出 提高工作效率
  5. 分享一篇获取键盘数值的js(限制在IE浏览器)
  6. TrackMouseEvent 与_TrackMouseEvent
  7. NMEA0183标准语句
  8. 使用nginx反向代理解决前端跨域问题
  9. 三星 NAND 存储器新厂施工顺遂,上半年有望如期投产
  10. 【BZOJ28323874】宅男小C [模拟退火][贪心]