使用私有构造函数强化singleton属性

使用私有构造函数强化singleton属性:

实现singleton有两种方法:这两种方法都要把构造函数保持为私有的,并且提供一个静态成员,以便允许客户能够访问该类唯一的实例:

第一种方法:

public class Elvis{

public static final Elvis INSTANCE = new Elvis();

 

private Elvis(){

...

}

...//Remainder omitted

}

第二种方法:

提供了一个公有的静态工厂方法,而不是公有的静态final域;

public class Elvis{

 

private static final Elvis INSTANCE = new Elvis();

 

private Elvis(){

...

}

 

public static Elvis genInstance(){

return INSTANCE;

}

...Remainder omitted

}

所有对于静态方法Elvis.getInstance()的调用,都会返回同一个对象引用,所以,不会有别的Elvis实例被创建。

第一种方法的好处在于,组成类的成员的声明很清楚地表明了这个类是一个singleton;公有的静态域是final的,所以该域将总是包含相同的对象引用。第一种方法可能在性能上稍微领先,但是在第二种方法中,一个优秀的JVM实现应该能够通过将静态工厂方法的调用内联化(inlining),来消除这种差别。

 

第二种方法的好处在于,它提供了灵活性;在不改变API的前提下,允许我们改变想法,把该类做出singleton,或者不做成singleton,singleton静态工厂方法返回该类的唯一实例,但是,他也很容易被修改,比如说,为每个调用方法的线程返回一个唯一的实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值