文档章节

设计模式之单例模式(创建型)

smileNicky
 smileNicky
发布于 2018/12/02 23:14
字数 1247
阅读 1
收藏 0

前言

本博客介绍一种创建型模式:单例模式 这是一种比较容易理解的设计模式,可以理解为创建对象的一种很好的做法。可以尽量避免创建过多的对象,给JVM造成很大的负载。

应用场景

单例模式的一些应用场景: 1、比如数据连接类,这是需要经常调用的 2、网站访问量统计的服务类,需要多次调用 3、导出导入Excel表,一些业务复杂的系统需要多次调用 ...

总结起来就是需要经常调用的通用类,我们可以用单例模式进行很好的设计。

编程思想

单例模式涉及了两种重要的编程思想:懒加载思想和缓存思想

缓存思想:

	private static Singleton instance = null;//先放内存缓存
   
    public static Singleton getInstance() {
        if (instance == null) {//内存加载不到,创建对象
            instance = new Singleton();
        }
        return instance;//内存缓存有,直接调用
    }

懒加载思想: 下面例子就是懒加载的简单应用,创建一个对象都是需要用的时候实例,尽量不要在加载类的时候就实例了,这种方法可以很好的避免给JVM增加负载。这是一种很好的编程习惯。

public static Singleton getInstance() {
        if (instance == null) {//对象需要用时才实例
            instance = new Singleton();
        }
        return instance;
    }

单例模式实例

下面介绍几种常用的单例模式实例

1、懒汉模式 这是一种线程不安全,懒加载的方式

public class Singleton {
    private static Singleton instance;
    //定义private构造函数,使类不可以被实例
    private Singleton (){}

    /**
     * 懒汉模式,线程不安全,懒加载
     * @return
     */
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

上面例子线程不安全,要线程安全可以加个同步锁,不过加了同步锁性能又不好了,加载慢

public class Singleton {
    private static Singleton instance;
    //定义private构造函数,使类不可以被实例
    private Singleton (){}

    /**
     * 懒汉模式,线程安全,懒加载
     * @return
     */
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2、饿汉模式 下面介绍一下单例模式的另外一种实现方式,饿汉模式 其实现原理就是在类内部全局new一个对象,利用Java虚拟机的类加载机制,保证了线程安全,不过很明显,一创建了,就实例了单例类,会给JVM增加负载

public class Singleton {
    //定义private构造函数,使类不可以被实例
    private Singleton (){}


    //加载类的时候,利用JVM的类加载机制创建对象,保证了线程安全,但是效率不好
    private static Singleton instance = new Singleton();

    /**
     * 饿汉模式,线程安全,非懒加载
     * @return
     */
    public static Singleton getInstance() {
        return instance;
    }
}

3、双检锁/双重校验锁(DCL,即 double-checked locking) 下面介绍一种双检锁的实现方式,这种方式看起来稍稍比较复杂了点,不过可以实现线程安全,同时双检锁的方式可以保证性能比较高

public class Singleton {
 
    //定义private构造函数,使类不可以被实例
    private Singleton (){}

    private volatile static Singleton instance;

    /**
     * 双检锁/双重校验锁(DCL,即 double-checked locking)线程安全,懒加载
     * @return
     */
    public static Singleton getInstance(){
        if(instance == null){
            synchronized (Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

4、登记式/内部类 下面用内部类的方式来实现单例模式,这种方式可以和饿汉模式来对比一下 这种方式和刚才介绍的饿汉模式类似,不过区别就是做到了懒加载,我们可以分析例子。方法就是在单例类里加个内部类,这样做就不会像饿汉模式一样,单例类一加载就实例对象。当调用getInstance方法的时候,才会调用,创建对象。这样就做到了懒加载,同时也是利用JVM保证了线程安全

public class Singleton {
   
    //定义private构造函数,使类不可以被实例
    private Singleton (){}

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

    /**
     * 登记式/静态内部类,线程安全,懒加载
     * @return
     */
    public static Singleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

5、枚举模式 这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。不过,由于 JDK1.5 之后才加入 enum 特性,用这种方式写不免让人感觉生疏,在实际工作中,也很少用。

/**
     * 枚举方式
     */
    public enum Singleton {
        INSTANCE;
        public void whateverMethod() {
        }
    }

© 著作权归作者所有

smileNicky
粉丝 12
博文 19
码字总数 24361
作品 2
西城
程序员
私信 提问
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
285
2
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
2018/03/22
0
0
设计模式之抽象工厂模式(创建型)

模式定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 模式角色 抽象...

smileNicky
01/01
0
0
JavaScript设计模式总结

之前看过《JavaScript设计模式与开发实践》这本书,对书中的设计模式和一些相关案例也有了一定的了解,同时把这些设计模式的应用对应在在一些其他的项目中,进行了一些整理,如下仅供参考: ...

jefferyE
03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何倒放视频

很多视频通过倒放制作,可以到达不可思议的视觉效果。那这些神奇的倒放视频上如何制作的呢?其实制作方法非常的简单,下面就一起来看看如何倒放视频吧! 具体步骤如下: 第一步: 首先打开手...

白米稀饭2019
35分钟前
3
0
可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! **导读:**InfoQ 发布《2019 中国 Java 发展趋势报告》,反映 Java 在中国发展的独特性,同时也希望大家对 Ja...

阿里巴巴云原生
35分钟前
3
0
Mybatis 配置详解

完整配置 mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.......

xiaolyuh
36分钟前
4
0
与Windows用户共享Mac文件

与 Windows 用户共享 Mac 文件 若要允许用户从 Windows 电脑连接到您的 Mac,请打开文件共享和启用 SMB 共享。 在 Mac 上设置文件共享 在 Mac 上,选取苹果菜单 >“系统偏好设置”,然后点按...

W_Lu
43分钟前
6
0
CaaS: 内容是新的基础设施 Content-as-a-Service

内容是每家企业的必争之地,根据 CMI 的数据报告,88% 的 B2B 企业每天至少产生一篇内容。内容正在成为新的基础设施,Content as a Service 可以被简单理解为一种 CMS(Content Management ...

Authing
48分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部