1. 定义

为了确保一个类有且仅有一个实例,而且自行实例化并向整个系统提供这个实例。

2. 使用场景

确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。例如,创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时候就需要考虑使用单例模式。

3. 机制

创建一个独一无二觉得的对象,有多种方式。但是不管你如何创建一个单例对象,都必须要确保其他开发人员不能创建该单例对象的新的实例。

那么如何做到这一点呢?  答:为了避免其他开发人员实例化你定义的类,可以创建唯一一个构造函数,并将其设置为私有的访问权限。注意,如果创建了其他非私有的构造函数,或者没有创建任何构造函数,其他对象都能够实例化改类。

设计一个单例类的时候,需要确定何时实例化该类的单例对象。一种做法是创建这个类的实例,并将它作为该类的静态成员变量。例如:

private static Factory factory = new Factory();

然后通过一个公共的getFactory()静态方法获得该类的唯一实例。实例代码:

public class Factory{private static Factory factory = new Factory ();public static Factory getFactory() {return factory;}private Factory() {}
}

如果不希望提前创建单例实例,还可以在第一次需要的时候,延迟初始化它。

if (factory == null) factory = new Factory();

延迟不延迟有哪些方面的区别呢? 为什么实例化还有延迟和非延迟?   一般延迟实例化对象有两个原因: 1. 在静态初始化的时候,没有足够的信息对单例对象进行初始化。  2. 选择延迟初始化单例对象与获取资源有关,如数据库连接,没有使用的需求,就没有必要实例化该单例对象。

3. 单例与线程

如果想在多线程环境下延迟初始化一个单例模型,必须避免多个线程同时初始化该单例对象。在多线程环境下,无法保证在其他线程开始执行该方法时,当前线程已经完整的执行完该方法。这可能出现两个线程同时初始化一个单例对象的情况。为了避免这种情况,需要使用双重校验锁机制(Double Check Lock)去协调不同线程对同一方法的执行。

public class SingletonClass {private static SingletonClass instance = null;public static SingletonClass getInstance() {if(instance==null) {synchronized(SingletonClass.class) {if(instance==null) {instance=new SingletonClass();}}}return instance;}private SingletonClass() {}
}

单例模式或许是最负盛名的一个设计模式,但是很容易被误用,不要让单例作为创建全局变量的一种花哨方法。因为单例会引入耦合,应减少使用单例模式的类的数量。最好的方式是:类只知道与它协作的对象,不必了解它所需要的限制。 需要注意的是:对象具有唯一性,不代表使用了单例模式。

4. 推荐使用的单例模式实现方式

在应用单例模式时,我们知道懒汉模式、饿汉模式、双重检验锁模式。这些实现方式都有各自的特点和缺陷,其中双重校验锁算性是应用最为广泛的,但是也不是完美的。《Java并发编程实践》这本书给出来一个推荐的实现方式:

public class Singleton {// 构造函数private Singleton() {}public static Singleton getInstance(){return SingletonHloder.sInstance;}// 静态内部类private static class SingletonHloder {private static final Singleton sInstance = new Singleton();}
}    

实现方式解读:

当第一次加载Singletion类时并不会初始化sInstance,只有在第一次调用Singleton的getInstance方法时才会导致sInstance被初始化。因此,第一次调用getInstance方法会导致虚拟机加载SingletonHolder类,这种方式不仅能够确保线程安全,也能保证单例对象的唯一性,同时也延迟了单例的实例化,所以这是推荐使用的单例模式的实现方式。

设计模式总结(Java)—— 单例模式相关推荐

  1. 【设计模式】Java单例模式-深度分析

    饿汉式,一上来就创建 //饿汉式单例 public class Hungry {private Hungry(){}private final static Hungry HUNGRY= new Hu ...

  2. java单例模式 三种_三种java单例模式概述

    在java语言的应用程序中,一个类Class只有一个实例存在,这是由java单例模式实现的.Java单例模式是一种常用的软件设计模式,java单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.下 ...

  3. Java设计模式中的单例模式

    有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...

  4. java单例模式-有用的模式

    单例模式是一种常见的设计模式,在<Java与模式>一书中,阎宏博士对单例模式做了全面的总结. JavaSingleton模式就为我们提供了这样实现的可能.使用Singleton的好处还在于 ...

  5. 设计模式之一:单例模式

    设计模式之一:单例模式 目录介绍 1.单例模式介绍 2.单例模式定义 3.单例模式使用场景 4.单例模式的实现方式 4.1 懒汉式[线程不安全] 4.2 懒汉式[**synchronized 线程安全 ...

  6. 深入Java单例模式

    在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下.   所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在 ...

  7. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  8. 手撕设计模式之「单例模式」(详细解析)

    前言 单例模式主要用来保证系统中某个类的实例对象的唯一性,是最简单的一种设计模式,而且在面试中也经常会被问到,是非常值得我们去学习的.如果你们面试遇到了哪些设计模式的考察,也欢迎留言,我会及时发新的博 ...

  9. 23种设计模式[1]:单例模式

    前言:  听说懂设计模式的Developer工资会高很多?最近面试也被问到熟悉设计模式有哪些?于是便有此文. 语言背景:PHP.Java 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这 ...

  10. Java单例模式:为什么我强烈推荐你用枚举来实现单例模式

    写在前面--原作的这篇文章真的写的非常的简洁,逻辑清晰,将Java单例模式的各种写法写的非常清楚,并介绍了用枚举实现单例的最佳实践. 单例模式简介 单例模式是 Java 中最简单,也是最基础,最常用的 ...

最新文章

  1. 使用 CommandBuilder 生成命令 (ADO.NET)
  2. 033_CSS相对定位
  3. Python运算符可不只有加减乘除
  4. 数据结构——二叉树的遍历
  5. 运维请注意:”非常危险“的Linux命令大全
  6. JetBrains 发布Kotlin 1.0
  7. 快递信息管理系统源代码c++_学生信息管理系统C语言版
  8. jupyter怎么调字体_夏天冰箱调到几档最好 冷藏调多少度合适
  9. 从C语言到C++语言
  10. 极限学习机和支持向量机_极限学习机的发展
  11. 机器学习中的numpy的array_机器学习阶段总结(numpy)
  12. rmt_redis.c:6446 ERROR: Can't handle RDB format version redis-migrate-tool迁移工具报错
  13. 图解机器学习算法(2) | 模型评估方法与准则(机器学习通关指南·完结)
  14. NexT主题添加音乐
  15. 百度招聘实习生:网页搜索部_语法研究实习工程师(七种语
  16. You need to prove you’re evil cheap nike air max
  17. 【MATLAB】在MATLAB中用梯形法求一个表达式在某区间里的积分值
  18. Eclipse Error - Error notifying a preference...
  19. 数组 reduce 简介及使用场景
  20. 六、分享优秀的Armv8 虚拟化技术地址

热门文章

  1. win7倒计时桌面小工具_这些小工具,彻底解放了我的电脑桌面
  2. linux centos7上安装sql developer
  3. 浏览器解析jsx_简单理解JavaScript,TypeScript和JSX
  4. python消息中间件activemq_消息中间件ActiveMQ和JMS基础
  5. h5页面保存img_如何设计H5编辑器中的模版库并实现自动生成封面图
  6. python中初始化方法_Python中类的初始化特殊方法
  7. 使用HttpClient发送WebService Security(WSS)请求
  8. 一个简单的EJB-Session Bean实例
  9. springboot注解整理
  10. 大数据学习笔记:ZooKeeper练习