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. Sql Server 服务器名称\实例名称 无法连接 Server Name\Instance Name

      解决步骤: 1:  Sql Server是否已经启动. 2:  检查Sql Server服务器是否开启TCP/IP协议. 侦听的默认端口为1433          3:     ping 数据库 ...

  2. Programming C#.Classes and Objects.传递参数

    ref 关键字通过引用(而非值)传递参数. 通过引用传递的效果是,对所调用方法中的参数进行的任何更改都反映在调用方法中. 说明: 不要混淆通过引用传递的概念与引用类型的概念. 这两种概念是不同的. 无 ...

  3. php页面相互调用的知识点

    目前我们有这样一个需求: (1) a.php  页面要使用 b.php 定义的函数,我们可以使用 如下指令 require  require_once include   include_once 举 ...

  4. android DatePickerDialog theme

    网上搜索了下没有找到DatePickerDialog的各种 Theme 的样例.我就一个一个试了下,传上图片 DatePickerDiaolog有两个构造函数分别是: DatePickerDialog ...

  5. Oracle EBS-SQL (SYS-22):sysadmin_用户职责查询.sql

    select fu.user_name 用户名, fu.description 用户说明, frv.RESPONSIBILITY_NAME 职责名称, REQUEST_GROUP_NAME 报表组, ...

  6. impala安装

    http://blog.sina.com.cn/s/blog_8c6d7ff60101e3lh.html ----------------------------------------------- ...

  7. Office 2010 Toolkit and EZ-Activator

    “Office 2010 Toolkit 2.0.1”是“迷你KMS”的更新换代版本.虽然是单一可执行程序,但一身承担两大职能:“KMS服务器”和“客户激活端”.“Office 2010 Toolki ...

  8. 点击按钮改变标签内容(采用lambda函数方式)

    from Tkinter import* window=Tk() counter=IntVar() counter.set(0) def click(variable,value): variable ...

  9. java 操作配置文件 .properties

    package com.dms.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...

  10. [置顶] Oracle GoldenGate 常见问题:长事务处理

    长事务的影响 OGG是基于事务级的实时复制工具,也就是说OGG只复制已提交的事务,在遇到事务的commit或rollback之前,它会将每个事务的操作存储在称为cache的托管虚拟内存池中.内存再大也 ...