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

一、为什么叫单例模式?

“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. Request和Response

    1 简介 web服务器收到客户端的http请求,会针对每一个请求,分别创建一个用于代表请求的request对象和代表响应的response对象. request和response对象既然代表请求和响应 ...

  2. java面向对象基础(二)

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  3. matlab输入输出语句(input、disp、fprintf)

    输入语句 输入数值 ?x=input('please input a number:') please input a number:22 x = 22 输入字符串 ?x=input('please ...

  4. 开发JQuery插件(转)

    教你开发jQuery插件(转)   阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原 ...

  5. ASP.NET没有魔法——ASP.NET MVC 模型验证

    在前面的文章中介绍了用户的注册及登录功能,在注册用户时可以通过代码的形式限制用户名及密码的格式,如果不符合要求那么就无法完成操作,如下图: 该功能的原理是Identity基于的Entity Frame ...

  6. VBA小技巧

    运用VBA时,可以构造一些函数去实现诸如printf的方便函数. Public Function printf(mask As String, ParamArray tokens()) As Stri ...

  7. 官方新出的 Kotlin 扩赞库 KTX,到底帮你干了什么?

    Kotlin KTX 2月5号的时候,Google 发布了一款 Kotlin 的扩展库,叫 Android KTX,不过现在还处于预览版的状态.它能使 Android 上的 Kotlin 代码更简洁, ...

  8. [搬运] DotNetAnywhere:可供选择的 .NET 运行时

    原文 : DotNetAnywhere: An Alternative .NET Runtime 作者 : Matt Warren 译者 : 张很水 我最近在收听一个名为DotNetRock 的优质播 ...

  9. 浏览器通过file://访问文件和通过http://访问文件有什么区别

    1.file协议用于访问本地计算机中的文件,就如同在Windows资源管理器中打开文件一样,注意它是针对本地(本机)的,简单来说,file协议是访问你本机的文件资源.http访问本地HTML,是在本地 ...

  10. CentOS7安装MySQL的方法之通用二进制格式

      CentOS7安装MySQL的方法之通用二进制格式