文档章节

设计模式1-单例设计模式

h
 hfni
发布于 2015/08/22 19:35
字数 699
阅读 12
收藏 0

核心:

保证一个类只有一个实例,并且提供一个访问该实例的方法。

优点:

1、只有一个实例,减少系统的资源占用。

2、在系统设置全局访问点,优化共享资源的访问。

常见的实现方式:

1、私有化构造函数

2、直接创建静态的类对象(静态类对象会在初始化的时候自动装载)

3、创建一个开放的静态方法访问该类对象。

主要:

    饿汉式:(线程安全,调用效率高,但是不能延时加载)

        当类加载器加载类的时候立即创建该类对象(加载类时,是天然安全的),不管以后有没有用。

        如果以后没用到,可能造成系统资源的浪费。

    

    懒汉式:(线程安全,调用效率不高,可以延时加载)

            在类加载时并不直接初始化,而是等到要用的时候才初始化。

            这个方法需要synchronized实现同步。

            public static synchonized getInstance(){

            if(s==null){

                s=new  SingleDemo()

            }

            return s;

        }

        缺点:每次调用方法都要同步

    双重检测锁模式:

    

    由于编译器优化原因及jvm底层内部模型原因,有时会出问题。


    静态内部类实现方式(也是懒加载方式):

    外部类: SingletonDemo

    在静态类内部:

    private static class SingletonInner{

        private static SingletonDemo  instance=      new SingletonDemo();

    }


    public  static getInstance(){

        return SingeltonInner.instace

    }


    使用枚举实现单例模式:

    枚举本身就是单例模式,有JVM从根本上保障,避免通过反射和反序列化的漏洞。

    缺点:无延时加载



       通过反射和反序列化可以破解除枚举以外的单例。

        反射:通过反射机制直接调用私有构造器。

        反序列化:先通过序列化将对象写入硬盘中,再通过反序列化将对象从硬盘总读出,这时会创建一个新的实例。

        如何防止?

        1、当利用反射时:

              当调用构造函数的时候,判断要返回的实例是否为空,如果不为空,则直接抛出异常。

        2、当利用反序列化时:

                在类中通过定义方法  private Object readResolve(){

                                                    return instance;}    

                当反序列化时如果类中已经定义了该方法,则返回该方法指定的对象,而不需要返回反序列化所产生新对象。

    


        执行效率:

        懒汉式比其他方大概要慢两个数量级。

        

        如何选择:

            当创建单例对象所耗费的资源少,不需要延时加载:枚举型优于饿汉式

            当创建对象所耗费的资源较多时,且需要延时加载:静态内部类对象方式优于懒汉式。

                

    

© 著作权归作者所有

共有 人打赏支持
h
粉丝 0
博文 4
码字总数 699
作品 0
南京
私信 提问
设计模式1——Singleton设计模式

Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序运行生命周期中,使用了单例模式的类只能有一个实例对象存在。单例模式实现了类似C语言中全局变量的功能,单例模式常用于注册...

小米米儿小
2013/12/05
0
0
23种设计模式(1):单例模式

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名、属性、方法 2.以<<开头和以>>结尾的为注释...

LCZ777
2014/07/05
0
0
【23种设计模式之一】单例设计模式(翻译)

引言: 这一系列文章,翻译自网络上的文章,不过中间会夹杂着个人的理解,非原创,不过中文应该算是原创。 下面介绍,使用设计模式的一些好处: 1、设计模式是已经在工业生产中使用的,用于解...

敲代码猥琐男
2015/01/13
0
2
Java程序员从笨鸟到菜鸟之(三十三)大话设计模式(三)单例模式

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说...

长平狐
2012/11/12
120
0
JS单例模式《JavaScript设计模式与开发实践》阅读笔记

此文仅记录本人阅读《JavaScript设计模式与开发实践》这个本时的感受,感谢作者曾探写出这么好的一本书。如有冒犯,如有错误,请联系本人:luogao_lg@sina.com处理。 这一章让我知道了单例模...

RoyLuo
2018/05/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

AWS 为 Elasticsearch 推出开源发行版

AWS 近日宣布为 Elasticsearch 推出开源发行版 Open Distro for Elasticsearch。 Elasticsearch 是一个分布式、面向文档的搜索和分析引擎,它支持结构化和非结构化查询,并且不需要提前定义模...

linux-tao
32分钟前
6
0
spring cloud与spring boot版本对应关系

https://spring.io/projects/spring-cloud 看Release Train Greenwich |2.1.x |- Finchley |2.0.x Edgware |1.5.x Dalston |1.5.x...

Danni3
32分钟前
2
0
开源 java CMS - FreeCMS2.8 数据对象 guestbook

项目地址:http://www.freeteam.cn/ guestbook 在使用留言相关标签时,标签会封装guestbook供页面调用。 属性 说明 id id siteid 所属站点id memberid 留言会员id membername 留言会员名称 ...

freeteam
35分钟前
1
0
【java+selenium】网易云音乐刷累计听歌数

背景 应该是在去年的时候,刷知乎看到一个问题,大概是说怎么刷网易云音乐个人累计听歌数,然后有一个高赞回答,贴了一段js代码,直接在浏览器console执行就可以了。当时试了下,直接一下子刷...

卧颜沉默
37分钟前
3
0
开启阿里云linux下的pure-ftpd被动模式,解决flashfxp可连接但无法下载的问题

由于某个网站的备案出现问题,只能将网站临时迁到香港服务器,原服务器是阿里云的centos系统,ftp服务器是用的pure-ftpd,香港服务器由于历史原因装的是server 2008 32位,ftp软件用的是fla...

我退而结网
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部