第一节:通过静态工厂创建对象
- 可阅读性强.
public class Person {
private byte sex;
private String name;
public static Person newMan(String name){
return new Person(0, name);
}
public static Person newWoman(String name){
return new Person(1, name);
}
public Person(String sex, String name){
this.sex = sex;
this.name = name;
}
public static void main(String[] args){
// 静态工厂
Person jeck = Person.newMan("Jeck");
// 构造
Person tom = new Person(0, "Tom");
}
}
相较于构造方法创建对象,静态工厂总是能很清晰的突出我们要做的事.
- 不必在每次调用时都创建一个新的对象,比如:单例模式.
...
// 例:单例模式
private static Person INSTANCE;
public static Person newMan(String name){
if(INSTANCE == null){
INSTANCE = new Person(0, name);
}
return INSTANCE;
}
// 例:软引用持有对象
private SoftReference<Person> person;
public static Person newMan(String name){
if(person == null || person.get() == null){
person = new SoftReference(new Person(0, name));
}
return person;
}
- 控制返回类型,可以返回具体或抽象的类.
总结:通过静态工厂创建对象更回灵活、可阅读性更好.
第三节:通过私有构造或枚举强化单例
特别注意点:防止单例的序列化
// 在类中添加此方法
private Object readResolve(){
return INSTANCE;
}
- 枚举实现单例模式
public enum Person{
INSTANCE;
}
第四章:通过私有构造器强化强化不可实例化的能力
public final class Strings{
private Strings(){ throw new AssertionError(); }
public static boolean isEmpty(String string){
return string == null || string.length < 0;
}
}
第五章:避免创造不必要的对象
重用不可变对象
- 重复创造相同对象的开销
- 静态工厂方法与构造方法相比