文档章节

单例模式

青古城
 青古城
发布于 2016/12/11 15:27
字数 474
阅读 33
收藏 0

    单例模式(Singleton Pattern)是比较简单,也比较常问到的一种设计模式,即使刚入坑的同学也能说上几句,顾名思义,单例模式是指系统中一个类有且只有一个实例。

    单例模式定义:保证一个类有且仅有一个实例,并且自行实例化向整个系统提供。    ---《设计模式》

    单例模式的实现方式有多种,网上也有很多资料,这里只介绍博主常使用的两种;

  • 饿汉式:基于类加载机制保证单例的初始化工作,不过,instance在类加载时就实例化,无法达到lazy loading的效果。(因此有一种基于静态内部类的实现,有兴趣的同学可以Google)
public class Singleton {

    private static final INSTANCE = new Singleton();//初始化单例

    private Singleton(){}  //私有构造方法,避免new出新实例

    public static Singleton getInstance() {
        return INSTANCE;
    }

}
  • 枚举方式
public enum Singleton {

    INSTANCE;

    public void whateverMethod() {
    }
}

第一种方式,正常情况下,能够保证单例,但还是有一些情况,可能会造成出现多实例的情况,比如通过Java的反射机制,测试代码如下:

public class SingletonTest {
    public static void main(String... args) {
        SingletonPattern s1 = SingletonPattern.getInstance();
        Class c1 = Class.forName("com.moze.designpattern.Singleton");
        Constructor[] cons1 = c1.getDeclaredConstructors();
        Constructor cc1 = cons1[0];
        cc1.setAccessible(true);
        SingletonPattern s2 = (SingletonPattern) cc1.newInstance();
        System.out.println(s1 + "/" + s2);
        System.out.println(s1 == s2);
    }
}

枚举方式没有上述产生多例的状况,也是《Effective Java》中建议使用的方式。

PS:关于单例模式与静态方法类,网上也有好多说法,主要是根据面向对象程序设计的思路进行区分,实际效率方面,单例与静态方法的无太大差异;一般工具类采用静态方法类;

© 著作权归作者所有

共有 人打赏支持
青古城
粉丝 0
博文 1
码字总数 474
作品 0
朝阳
私信 提问

暂无文章

详解如何实现一个简单的 vuex

首先我们需要知道为何要使用 vuex。父子组件通信用 prop 和自定义事件可以搞定,简单的非父子组件通信用 bus(一个空的 Vue 实例)。那么使用 vuex 就是为了解决复杂的非父子组件通信。 仅仅...

嫣然丫丫丫
2分钟前
0
0
算法——RangePartitioner实现之reservoirSample

简介 reservoir的作用是:**在不知道文件总行数的情况下,如何从文件中随机的抽取一行?**即是说如果最后发现文字档共有N行,则每一行被抽取的概率均为1/N? 我们可以:定义取出的行号为cho...

freeli
4分钟前
0
0
Python安装及netcdf数据读写

一、在CentOS7系统上安装Python3 在anaconda官网下载(http://https://www.anaconda.com/download/#linux)(Anaconda指的是一个开源的Python发行版本,是Python的包管理器和环境管理器) 下...

voole
8分钟前
0
0
基于NEO的私链(Private Blockchain)

1.准备工作 1.NEO-GUI 2.NEO-CLI 3..NET Core Runtime (不能是2.x版本,官方建议是1.12,实际上我用1.14也是没有问题的) 4.四台windows操作系统的虚拟机(本文是基于AWS的,理论上本地跑虚...

NEO-FANS
15分钟前
0
0
linux中shell if 判断总结

UNIX Shell 里面比较字符写法 -eq 等于; -ne 不等于; -gt 大于; -lt 小于 ; -le 小于等于; -ge 大于等于; -z 空串; -n 非空串; = 两个字符相等; != 两个字符不等 无论什么编程语言都离不开条...

linuxprobe16
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部