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

一、为什么叫单例模式?

“baby,你就是我的唯一,两个世界都变形,回去谈何容易...”。咳咳~就先唱到这吧,入正题。每次提起单例模式,笔者都会哼起这首王力宏的《唯一》。为什么?这首歌哪里吸引我了?就是“唯一”这两个非常有粪量的字。

斯大林时期的苏联,个人崇拜达到相当严重的程度。然而为什么会导致个人崇拜呢?很简单,那就是“只有一个斯大林,只有一个领导人”!不允许出现两个或者多个领导人,国家政务、外交等等大事小事都需要斯大林来发号施令。

定义

保证一个类只有一个实例,并且整个系统能访问该实例。

特点

  1. 单例类保证只有一个实例
  2. 单例类必须自己创建自己的唯一实例
  3. 单例类提供给系统提供该唯一实例

单例的定义也就是这么简单,还不明白?直白点就是该类只能new一个对象,不允许new第二个对象,而系统访问的就是该对象。

那有什么办法保证只有一个领导人斯大林呢?较常见的两种方式:饿汉式懒汉式

二、实战

UML图

这里提示一点,在学习设计模式的时候,UML图会让你更容易,而且深刻的去理解到该模式的核心。况且,UML图也是成为项目管理者必备的技能。

上代码

如何确保一个系统只产生一个实例?这里必须使用private修饰构造函数,并且在构造函数里边实例化。

前面提到了单例模式比较常见的两种方式:饿汉式懒汉式。下面我们来具体看看到底有多饿,以及到底有多懒!

1、饿汉式

首先,来看一下饿汉式单例模式。

饿汉式单例代码如下:

public class EagerSingleton {

	private static EagerSingleton singleton = new EagerSingleton();

	private EagerSingleton() {
} public static EagerSingleton getSingleton() {
return singleton;
}
}

注意,这里获取实例必须使用静态方法,要不然类外部无法访问通过该方法得到唯一实例。

“饿汉式”顾名思义,已经等不及外部需要用到的时候才实例化,于是在装载类的时候就创建对象实例,一个自力更生的好榜样~

饿汉式单例存在的问题主要是:既然在初始化的时候就已经装载类,必然会消耗内存。

2、懒汉式

懒汉式单例代码如下:

public class LazySingleton {

	private static LazySingleton singleton = null;

	private LazySingleton() {
} public static synchronized LazySingleton getSingleton() {
if (instance == null) {
singleton = new LazySingleton();
}
return singleton;
}
}

这里使用了synchronized进行同步,以保证线程安全

“懒汉式”的定义也容易理解,因为懒,所以当需要使用到该实例的时候才去创建对象实例,在此之前不对类进行实例化。

懒汉式单例主要问题:由于它的实现是线程安全的,会降低对实例的访问速度,并且每次都需要进行判断。

来到这的时候,既然上面两个方式的单例都存在着问题,那有没有一种方式,既能保证性能受到的影响小,并且可以保证线程安全的呢?网上很多现有的资源都提及到双重检查加锁,在我第一次看到这东西的时候就觉得名字都很麻烦,实际上它的实现也比较麻烦,还有就是volatile关键字对性能有所影响,因此不推荐使用,这里也不做介绍了。当然,选择哪一种方式是根据个人实际项目的情况来选用的。

先别着急走,接下来登场的是比较完美的实现单例模式的方式枚举单例

3、枚举单例

老规矩,先上代码:

public enum Singleton {

	singleton;

	public void singletonFunc() { // 该单例需要实现的功能
} }

是不是很简单?而且因为自动序列化机制,保证了线程的绝对安全。三个词概括该方式:简单、高效、安全

三、总结

好了,设计模式系列的第一篇到这就结束了。大家觉得哪里需要改进,或者是需要笔者提供支持的可以下边留言。刚开始的模式大家都比较容易理解,接下来才是重头戏。下一篇的设计模式是:工厂方法模式

设计模式Java源码GitHub下载:https://github.com/jetLee92/DesignPattern

我的Java设计模式-单例模式的更多相关文章

  1. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

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

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

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

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

  4. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  5. 【设计模式】Java设计模式 - 单例模式

    [设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...

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

    1. 概念: 单例模式是一种常用的软件设计模式.核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果 ...

  7. Java设计模式 - 单例模式 (懒汉方式和饿汉方式)

    概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...

  8. java设计模式——单例模式(一)

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

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

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

  10. Java设计模式-单例模式(Singleton)

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

随机推荐

  1. TCP/IP详解 卷1 第二十一章 TCP的超时与重传

    21.1 引言 可靠性的保证之一就是超时重传 前面两个超时重传的例子 1)  ICMP端口不能到达时,TFTP客户使用UDP实现了一个简单的超时和重传机制,假定5s是一个适当是时间间隔,并每隔5s进行 ...

  2. form表单中get和post两种提交方式的区别

    一.form表单中get和post两种提交方式的区别? 1.get提交表单中的内容在链接处是可见的.post不可见 2.post相比于get是安全的 3.post不收限制大小,get有限制大小(黑马视 ...

  3. 11_Python文件操作

    一.文件操作的基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...

  4. Spring Boot快速入门(最新)

    本章通过完成Spring Boot基础项目的构建并实现一个简单的Http请求处理,让大家对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性.预计阅读及演练过程将花费约5分钟. ...

  5. Springboot security cas源码陶冶-ExceptionTranslationFilter

    拦截关键的两个异常,对异常进行处理.主要应用异常则跳转至cas服务端登录页面 ExceptionTranslationFilter#doFilter-逻辑入口 具体操作逻辑如下 public void ...

  6. BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】

    传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Stein ...

  7. Python之MYsql、数据库

    一.数据库的操作及安装 1.安装  MySQL Community Server 5.7.16   ----   版本 2.初始化   mysqld --inisialize-insecure 3.启 ...

  8. 机器学习实践之Logistic回归

        关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2017年12月17日 19:18:31所撰写内容(http://blog.cs ...

  9. LeetCode - 596. Classes More Than 5 Students

    There is a table courses with columns: student and class Please list out all classes which have more ...

  10. ADO.NET 对数据操作

    public static class SQLHelper { static string connString = ConfigurationManager.ConnectionStrings[&q ...