最简单的设计模式——单例模式

前言

单例模式可以说是最简单也是最常见的设计模式了,有些语言比如scala甚至在语言层面对其进行了支持。单例是指类的实例在全局只有一个。什么时候我们希望类的实例在整个JVM进程中只有一个?比如说线程池:创建开销很大;还有缓存:占用内存空间很多,而且超过一个也不利于维护。还有其他比如注册表对象,日志对象等等我们都希望它们全局唯一。单例模式指导我们如何创建这样一个对象。

简介

定义

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

结构

实现

单例的实现有很多种,按单例对象是否延迟初始化可以分为懒汉是和饿汉式。每一种的实现又有两种变体。

常规饿汉式实现

public class Singleton {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {

        return INSTANCE;

    }

}

通过一个静态变量引用单例实例,该变量在类加载的时候就会初始化,线程安全。

枚举饿汉式实现

public enum  Singleton {
    INSTANCE
}

枚举类型的本质如下,区别仅在于静态变量是公有的,同样也是线程安全。

public class Singleton extends Enum<Singleton> {
    public static final Singleton INSTANCE = new Singleton();
}

使用静态内部类的懒汉式实现

public class Singleton {

    private Singleton() {

    }

    static class SingletonHolder {
        public static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

}

只有在调用getInstance方法时才会加载静态内部类SingletonHolder,该内有一个静态成员变量,该成员变量在类加载的时候初始化,指向一个单例对象。同样也线程安全。

带双重检查的懒汉式实现

public class Singleton {

    private Singleton() {

    }

    private static volatile Singleton INSTANCE;

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

}

这是所有实现方式中最重要的。倒不是因为它平时用的多(大部分情况下直接用常规的饿汉式单例就行了),而是因为面试的时候经常会被问到,很多时候甚至会让面试者把它现场手写出来。因为其本身并不复杂,但能很好的考察对多线程的理解程度。而且以volitile,线程同步,类加载机制为入口可以深入考察多线程和jvm领域更深入的知识。比如:

1.volitile在这里有什么用?你知道它还有什么功能吗?它是否能保证线程安全?它的底层是怎么实现的?

2.为什么要在方法内加同步代码块?可以把同步关键字放在方法上吗?它和前一种有什么区别?你觉得哪个更好?

可惜我在上家公司用这个问题面了不少3年左右开发经验求职者,能把这部分代码大概写对的都不到20%。可能因为我面的都是大数据开发工程师吧,java基础会薄弱些。

参考资料

-《设计模式之禅》

原文地址:https://www.cnblogs.com/takumicx/p/9270789.html

时间: 2024-08-01 01:45:46

最简单的设计模式——单例模式的相关文章

设计模式-最简单的设计模式 单例模式

单例模式:是最简单的设计模式 作用:就是保证在整个应用程序的生命周期中, 任何一个时刻,单例类的实例都只存在一个. 分为两种饿汉模式和懒汉模式 饿汉模式 :当类加载时比较慢 但是呢 获取对象快 public class Singleton { //把构造函数私有化的作用是 不允许在其他类中用new的方式创建 Singleton 的实例 private Singleton() { } //这个保证了在全局中只能有一个实例 private static Singleton singleton = n

最简单的设计模式——单例模式的演进和推荐写法(Java 版)

前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: 有这样一个类,该类在生命周期内有且只能有一个实例,该类必须自己创建自己的这个唯一实例,该类必须给所有其他对象提供这一实例(提供全局访问点),这样的类就叫单例类. 简单的说就是满足三个条件: 1.生命周期内有且只能有一个实例 2.自己提供这个独一无二的实例 3.该实例必须是能全局访问的 需要的考虑的

最简单的设计模式---单例模式

在Android操作系统中,常常使用到一种模式----单例模式.其实我们在项目开发过程中,也经常用到:例如:在C/S模式中,我们对工具栏的初始化:点击按钮弹出的对话框等.通常我们用一个全局变量使得一个对象访问,但它不能防止实例被多次实例化:最好的办法就是让类直接管理自己的实例对象,并返回实例对象. 什么是单例模式?保证一个类中仅有一个实例:并提供一个访问它的全局访问点.也就是说,一个类中他的所有构造方法为private类型,这样保证只能在类中创建对象:在类中声明一个全局的类对象实例:第三,在类当

设计模式之简单工厂和单例模式

近段时间发现自己越来越懒了,老师早就讲过的东西,一直没有总结!百度了一下,给的答案是设计模式总共23种.简单工厂属于其中一种,而单例模式并不是其中一种.今天总结下使用这两种模式写的项目. 设计模式:设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一

Java设计模式の单例模式

-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱汉式,非线程安全 c.饱汉式,线程安全简单实现 d.线程安全 并且效率高  单例模式最优方案 3.总结 a.使用枚举的单例模式 b.使用枚举,static处调用,初始化一次 -------------------------------------------------- 1.定义 确保一个类只有

c#设计模式-单例模式(面试题)

c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleton _instance = null; private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { _instance = new Singleton(); } return _in

c#设计模式-单例模式【转】

单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题 public class Singleton { private static Singleton _instance = null; private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { _instance = new Singleton(); } return _instance; } } 第

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

设计模式——单例模式学习

单例模式属于设计模式中的创建模式,即创建对象时,不再由我们直接实例化对象,而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能.更好的架构优势. 1.概念 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.选择单例模式就是为了避免不一致状态.使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection). Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对