1.5版本之前,我们通常实现单例模式有两种方式:

两种方法前提都是私有化构造器,然后通过不同的方式获取对象。

第一种:通过公共的静态变量获取

public class Elivs{
    // 私有化构造器
    private Elivs(){}
    // 通过静态私有变量保存对象
    public static final Elivs INSTANCE = new Elivs();
  }

第二种:通过静态方法获取

public class Elivs{
    // 私有化构造器
    private Elivs(){}
    // 通过静态私有变量保存对象
    private static final Elivs INSTANCE = new Elivs();
    // 提供静态公共接口获取对象
    public static Elivs getInstance(){
       return instance();
    }
}

第一种通过静态域获取对象的方式,其主要优势在于组成类的成员的声明很清楚地表面了这个类是一个Singleton:公有的静态域是final的,所以该域将总是包含相同对象引用。

PS:

公有域在性能方面没有任何优势可言,现代的JVM实现几乎都能够将静态工厂方法的调用内联化。

第二种工厂方法的优势在于,他提供了灵活性,可以在方法中扩展更多的操作,也可以在不改变API的前提下,改变类是否以Singleton进行创建。此外,如果是通过工厂方法获取对象的话,我们可以定义泛型来进行创建对象时的扩展。

在java1.5之后,其实是提供了第三种Singleton的模式,就是Enum枚举类型。

我们可以编写一个包含单个元素的枚举类型:

public enum Elvis{
     INSTANCE;

     public void leaveTheBuilding(){....}
}

这种方式与公有域方法相近,但是它更加简洁,无偿地提供了序列化机制,绝对防止多次实例化。

第三条:私有化构造器或者枚举类型强化Singleton属性的更多相关文章

  1. 《Effective Java》-——用私有构造器或者枚举类型强化Singleton属性

    Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统.使类成为Singleton会使它的客户端测试变得十分困难,因为无法给Si ...

  2. 《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性

    Singleton指只被实例化一次的类.一般用来搞那些创建很耗资源或者要求系统中只能有一个实例的类. 这个很经常使用.记得曾经实习面试的时候就有这个面试题. 一般採用的方法是将构造器私有化,然后提供一 ...

  3. 第三条:用私有构造器或者枚举类型强化Singleton属性

    1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public ...

  4. 第3条:用私有构造器或者枚举类型强化Singleton属性

    Singleton是指仅仅被实例化一次的类.通过被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统. 在http://www.cnblogs.com/13jhzeng/p/5256424. ...

  5. 【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性

    实现Singleton(代表本质上唯一的系统组件)的三种方法: 1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例. 2. 保持私有构造器,公有的成员是静态工厂方法. 3. 单元素的枚 ...

  6. 第3项:用私有构造器或者枚举类型强化Singleton属性

      Singleton指仅仅被实例化一次的类 [Gamma95].Singleton通常代表无状态的对象,例如函数(第24项)或者本质上唯一的系统组件.使类称为Singleton会使它的客户端测试变得 ...

  7. 用私有构造器或者枚举类型强化Singleton属性

    1.Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,如窗口管理器或者文件系统.使类称为Singleton会使它的客户端调试变的十分困难,因为无法给S ...

  8. 创建和销毁对象——用私有构造器或者枚举类型强化Singleton属性

    参考资料:<Effective Java>.<Java核心技术 卷1>.https://www.cnblogs.com/zhaosq/p/10135362.html 基础回顾 ...

  9. Effective Java 之 --- 用私有构造器或者枚举类型强化Singleton属性

    Singleton指仅仅被实例化一次的类,通常用来代表那些本质上唯一的系统组件,实现Singleton有三种方法: 1)公有静态成员是个final域,享有特权的用户可以调用AccessibleObje ...

随机推荐

  1. Velocity引擎导致jvm内存外内存泄露

    我公司一兄弟,在controller层,每次调用controller的时候都创建了velocity引擎,而且没有去关闭,最终导致的现象就是jvm的内存信息正常,但是jvm之外的内存发生了泄露,导致是用 ...

  2. js生成随机数的方法实例总结 [收藏]

    js生成随机数的方法实例总结 js生成随机数主要用到了内置的Math对象的random()方法.用法如:Math.random().它返回的是一个 0 ~ 1 之间的随机数.有了这么一个方法,那生成任 ...

  3. Java开发常用下载的网址

    cygwin国内镜像:http://mirrors.sohu.com/cygwin/ 旧版本的ant下载:http://archive.apache.org/dist/ant/ 旧版本的nutch下载 ...

  4. UIPasteboard 粘贴板

    UIPasteboard *pasteboard = pasteboard.string = self.label.text;

  5. 关于EJB 时间注解与oracle数据库时间格式

    EJB中Temporal是时间注解,其中TemporalType是时间注解的枚举类型其中包括 TemporalType类型,请看源码/*** Type used to indicate a speci ...

  6. QF——UI之UIViewController

    程序一经启动,AppDelegate的实例就会创建一个充满屏幕的window,它是App唯一的,一个App对应一个window.window是UIWindow类型的,继承于UIView,是种特殊的UI ...

  7. 安装虚拟机VMWare时出现1021错误的解决办法

    今天安装虚拟机(VMWare Workstation9.0),中途老是出现错误:Failed to create the requested registry key key installer er ...

  8. android 添加左右滑屏手势

    今天要在自己的项目中添加左右滑动,实现日期的加减(原来已经做了加减按键).滑动在一个中间的layout中进行 思路:添加左右划屏幕判断,得到判断后模拟加减按键按下. 模拟按键按下用 mbotton.p ...

  9. Oracle EBS-SQL (SYS-12):查询各Profile的设置情况.sql

    SELECT pro.profile_option_name, pro.user_profile_option_name, lev.level_type TYPE, --lev.level_code, ...

  10. Linux下diff使用简介

    diff用来比较两个文件的差异.首先构建两个相似的文件. Hello文件 world文件 使用diff -u  hello world > diff.txt,将两个文件的比对结果输入到diff. ...