码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-22 23:10:55      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   java   color   re   

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

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

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

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

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

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

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

PS:

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

 

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

 

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

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

mamicode.com,码迷
public enum Elvis{
     INSTANCE;
     
     public void leaveTheBuilding(){....}
}
mamicode.com,码迷

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

 

第三条 私有化构造器或者枚举类型强化Singleton属性,码迷,mamicode.com

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

标签:style   blog   http   java   color   re   

原文地址:http://www.cnblogs.com/goupb/p/3700296.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!