使用公有静态工厂方法来获取实例
- 构造器设为私有(私有构造器顺便来的特性:不能有子类)
- 如果要防止通过反射调用私有构造器,可以修改构造器,在被要求创建第二个实例时抛出异常
- 工厂方法提供了灵活性:如可以控制将单例改为每个线程返回一个实例等等...
- 如果要序列化(实现Serializable接口),还需要声明所有实例域都是非持久的(transient),并提供一个readResolve方法。在readResolve方法中返回预先创建的单例。private Object readResolve();
- 最好的实现单例的方法是使用只包含一个元素的枚举类型,无偿提供了序列化机制,绝对防止多次实例化,面对复杂的序列化和攻击也保证是单例的。