1. 使用静态工厂方法替代构造器
优势:
1. 静态方法有名字,可以清楚的表示不同静态工程方法的构造方式。
2. 不必在每次调用的时候都创建一个新对象,可以提升性能。
3. 可以返回原返回类型的任何子类型对象。
4. 在创建参数化类型实例的时候,它们使得代码变得更加简洁。
缺点:
1. 类如果不含有公有的或者受保护的构造器,就不能被子类化。
2. 它们与其他静态方法实际上没有任何区别。它们没有像构造器一样在API文档中明确标识出来,因此对于提供了静态工厂方法而不是构造器的类来说,无法查明如何实例化一个类。
2. 遇到多个构造器参数时要考虑用构建器
Builder 模式
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder{
//必选参数
private final int servingSize;
private final int servings;
//可选参数
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium=0;
public Builder(int servingSize, int servings) {
super();
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val){
calories = val;
return this;
}
public Builder fat(int val){
fat = val;
return this;
}
public Builder carbohydrate(int val){
carbohydrate = val;
return this;
}
public Builder sodium(int val){
sodium = val;
return this;
}
public NutritionFacts build(){
return new NutritionFacts(this);
}
}
public NutritionFacts(Builder builder) {
this.servingSize = builder.servingSize;
this.servings = builder.servings;
this.calories = builder.calories;
this.fat = builder.fat;
this.carbohydrate = builder.carbohydrate;
this.sodium = builder.sodium;
}
//客户端
public static void main(String[] args) {
NutritionFacts nutritionFacts= new NutritionFacts.Builder(240, 8).calories(100).sodium(30).build();
//……
}
}
3. 用私有构造器或者枚举类型强化Singleton属性
单例模式的5种实现(推荐使用后面三种):
public class Singleton1 {
private final static Singleton1 INSTANCE = new Singleton1();
private Singleton1(){}
public static Singleton1 getInstance(){
return INSTANCE;
}
}
================================================================
public class Singleton2 {
private final static Singleton2 INSTANCE;
static{
INSTANCE = new Singleton2();
}
private Singleton2(){}
public static Singleton2getInstance(){
return INSTANCE;
}
}
================================================================
public class Singleton3 {
public static volatile Singleton3 instance;
private Singleton3() {
}
public static Singleton3getInstance() {
if (instance == null) {
if (instance == null) {
synchronized (Singleton3.class) {
instance = new Singleton3();
}
}
}
return instance;
}
}
================================================================
public enum Singleton4 {
INSTANCE;
}
================================================================
public class Singleton5 {
private Singleton5(){}
private static class SingletonInstance{
private final static Singleton5 INSTANCE = new Singleton5();
}
public static Singleton5getInstance(){
return SingletonInstance.INSTANCE;
}
}
4. 通过私有构造器强化不可实例化的能力
工具类没有实例化的必要,故其可以通过私有构造器来禁止自己被实例化。