类中有多个构造函数,因此很难决定在开发期间调用哪一个。用能够说明意图的返回对象实例的Creation Method替换构造函数。
做法:
1、找出通过调用类的构造函数来创建实例的那个客户代码。对构造函数调用应用提炼方法重构,生成一个公共、静态的方法。这个新方法就是一个Creation Method。然后,应用搬移方法重构将Creation Method搬移到包括所选构造函数的类中。
2、找出调用所选构造函数类创建实例的所有代码,将它们更新为调用Creation Method。
3、如果所选构造函数链接到另一个构造函数,应该让Creation Method调用被链接的构造函数而不是所选构造函数。
4、对类中每个要转为构建方法的构造函数重复步骤1-3。
5、如果类中的某个构造函数在类外无调用,将它改为非公共的。
public class Person {
private String name;
private String phone;
private String car;
private String house;
public Person(String name, String phone, String house, String car){
this.name = name;
this.phone = phone;
this.house = house;
this.car = car;
}
public Person(String name){
this(name, null, null, null);
}
public Person(String name, String phone){
this(name, phone, null, null);
}
public Person(String name, String phone, String car){
this(name, phone, car, null);
}
}
我们在使用Person类的时候,会创建这几类人:有房有车有电话、没房有车有电话、没房没车有电话,只有电话、什么都没有的人。单单的一个Person构造函数无法表达清楚我们的这些需求。
public class Person {
private String name;
private String phone;
private String car;
private String house;
private Person(String name, String phone, String house, String car){
this.name = name;
this.phone = phone;
this.house = house;
this.car = car;
}
public static Person createPoorPerson(String name){
return new Person(name, null, null, null);
}
public static Person createPersonWithPhone(String name, String phone){
return new Person(name, phone, null, null);
}
public static Person createPersonWithPhoneCar(String name, String phone, String car){
return new Person(name, phone, null, car);
}
public static Person createRichPerson(String name, String phone, String house, String car){
return new Person(name, phone, house, car);
}
}
Person poor = Person.createPoorPerson("aqia");
Person rich = Person.createRichPerson("aqia", "1511510000", "house", "car");
优点:Creation Method没有命名限制,可以取一些能够清晰表达所创建的对象性质的名字。这种命名上的灵活性意味着两个名字不同的Creation Method可以接受数量和类型相同的参数。对于缺乏现代开发环境的程序员来说,寻找死Creation Method代码通常比寻找死构造函数代码要容易,因为搜索特殊名字方法的表达式,比搜索一组构造函数中的一个,要好写得多。
缺点:可能引入非标准得创建创建方式。如果大多数类都使用new实例化对象,而有些却使用一个Creation Method,那么程序员就必须了解每个类的创建使怎样完成的。