资讯专栏INFORMATION COLUMN

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

Jensen / 3258人阅读

摘要:那有什么办法保证只有一个领导人斯大林呢较常见的两种方式饿汉式和懒汉式二实战图这里提示一点,在学习设计模式的时候,图会让你更容易,而且深刻的去理解到该模式的核心。下一篇的设计模式是工厂方法模式。

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

一、为什么叫单例模式?

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

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

定义

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

特点

单例类保证只有一个实例

单例类必须自己创建自己的唯一实例

单例类提供给系统提供该唯一实例

单例的定义也就是这么简单,还不明白?直白点就是该类只能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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67901.html

相关文章

  • 深入理解单例模式

    摘要:总结我们主要介绍到了以下几种方式实现单例模式饿汉方式线程安全懒汉式非线程安全和关键字线程安全版本懒汉式双重检查加锁版本枚举方式参考设计模式中文版第二版设计模式深入理解单例模式我是一个以架构师为年之内目标的小小白。 初遇设计模式在上个寒假,当时把每个设计模式过了一遍,对设计模式有了一个最初级的了解。这个学期借了几本设计模式的书籍看,听了老师的设计模式课,对设计模式算是有个更进一步的认识。...

    FuisonDesign 评论0 收藏0
  • 求职准备 - 收藏集 - 掘金

    摘要:一基础接口的意义百度规范扩展回调抽象类的意义想不想通过一线互联网公司面试文档整理为电子书掘金简介谷歌求职记我花了八个月准备谷歌面试掘金原文链接翻译者 【面试宝典】从对象深入分析 Java 中实例变量和类变量的区别 - 掘金原创文章,转载请务必保留原出处为:http://www.54tianzhisheng.cn/... , 欢迎访问我的站点,阅读更多有深度的文章。 实例变量 和 类变量...

    cuieney 评论0 收藏0
  • Java设计模式---单例模式

    摘要:单例模式的几种实现方法具体如下懒汉模式优点可以延迟加载缺点多线程不安全饿汉模式优点多线程安全缺点加载类时就初始化完成无法延时加载双重检查优点多线程安全延迟加载缺点同步耗时静态内部类优点多线程安全延迟加载耗时短与双重检查相比用缓存实现优 showImg(http://7xjhi6.com1.z0.glb.clouddn.com/Java-Design-Patterns-Logo.png)...

    klivitamJ 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<