实现Singleton(代表本质上唯一的系统组件)的三种方法:

1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例。

2. 保持私有构造器,公有的成员是静态工厂方法。

3. 单元素的枚举类型已经成为实现Singleton的最佳方法。

前两种方法有两点注意:

1. 享有特权的客户端可以通过反射机制调用私有构造器。如果需要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常。

2. 如果要使其变成可序列化的,需要:

(1) implement Serializable;

(2) 声明所有实例域是瞬时(transient)的;

(3) 提供一个返回唯一实例instance的readResolve方法(因为每次反序列化一个序列化的实例时,都会创建一个新的实例)。

示例1:公有域——性能没有优势,但是组成类的成员声明清楚表明这是一个单例类。公有静态域是final的,总是包含相同的对象引用。

public class Elvis {
public static final Elvis instance = new Elvis();
private Elvis() { }
// method...
}

示例2:静态工厂方法——提供了灵活性,改变是否是单例类。但是很容易被修改。

public class Elvis {
private static final Elvis instance = new Elvis();
private Elvis() { }
public static Elvis getInstance() {
return instance;
}
// method...
}

示例3:单元素枚举——与公有域方法相近,但没有前面说的两个注意。无偿提供了序列化机制,绝对防止多次实例化。

public enum Elvis {
instance;
// method...
}

最新文章

  1. 【干货分享】流程DEMO-借款申请
  2. shll 变量
  3. 移动App崩溃的测试用例设计
  4. js判断用户浏览器是PC还是手机,自动跳转
  5. IKAnalyzer进行中文分词和去停用词
  6. 阅读jQuery源码的18个惊喜
  7. 一个有趣的模拟光照的shader(类似法线贴图)
  8. 安装.NET Framework组件时,电脑意外重启后再次安装失败
  9. 用js 将long类型转换成日期格式
  10. mysql Group By
  11. Win10系统安装Tomcat8
  12. Jira与Confluence集成、授权信息查看和问题汇总
  13. JavaScript中如何理解如何理解Array.apply(null, {length:5})
  14. Linux中DHCP服务器的简单配置
  15. 使用Jmeter监测服务器性能指标
  16. css 选择其父元素下的某个元素
  17. CSS的六大选择器
  18. 【读书笔记】iOS-如何选择本地化应用
  19. .net源码调试 http://referencesource.microsoft.com/
  20. Javascript、Jquery获取浏览器和屏幕各种高度宽度(单位都为px)

热门文章

  1. 十、一行多个:使用float布局的经典方法 ---接(一)
  2. Linux->Ubuntu配置tomcat开机自动启动
  3. linux系统开机突然黑屏,只有光标
  4. [零基础学JAVA]Java SE面向对象部分.面向对象基础(02)
  5. tp5.0和tp3.2中前台模板IF标签和FOREACH的区别
  6. TensorFlow基础(三)激活函数
  7. C#使用DotNetZip对zip压缩包进行添加删除操作
  8. Redis数据类型(上)
  9. Tomcat生命周期
  10. python -- @classmethod @staticmethod区别和使用