第二条:遇到多个构造器参数时,要考虑用构建器
静态工厂方法和构造器都不能很好的扩展到大量的可选参数,如果用构造函数,需要采用重叠构造器模式,缺点,当有很多参数时,客户端代码,很难调试,难以阅读,
第二种代替方法是JavaBean模式,缺点:构造过程被分到几个调用中,在构造过程中JavaBean,可能处于不一致的状态,而且阻止了把类变成不可变得可能,
第三种方法:Builder模式,能够保证像重叠构造器模式那样安全性,builder模式模拟了具名的可选参数,就像Ada和Python中的一样,
总结:如果类的构造器或者静态工厂方法中具有多个参数,设计这种类时,BUilder模式是个很好的选择,特别是大多数参数是可选的
第三条:用私有构造器或者枚举类型强化Singleton属性
三种方法:(1). public static final ClassName instanceName=new ClassName(); (2). 前面是private类型,public static getInstance(){return instanceName;}
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据
为了利用其中一种方法实现singleton 类变成可序列化(Serializable),声明中加上implements Serializable ,必须声明所有实例域都是舜时(tranient),并提供一个readResolve()方法,
控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据
我们现在再来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable
Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容
(3)只需要编写一个包含单个元素的枚举类型,
Java的枚举类型实质上是功能齐全的类,因此可以有自己的属性和方法。
Java枚举类型的基本思想是通过公有的静态final域为每个枚举常量导出实例的类。
从某个角度讲,枚举是单例的泛型化,本质上是单元素的枚举。
用枚举来实现单例非常简单,只需要编写一个包含单个元素的枚举类型即可。示例代码如下:
public enum Evils{
INSTANCE;
}
优点:更加简洁,无偿提供了序列化机制,绝对放在多次实例化,单元素枚举类型已经成为实现Singleton的最佳方法