上次说用静态工厂方法来代替构造器,好处有几点:
1、静态工厂方法有名称,你可以通过命名使其更有意义
2、使用静态工厂方法之后不必每次调用的时候都创建一个新的对象(静态工厂方法是static修饰的方法,其对象在程序第一次加载的时候就已经在内存中了,直到程序结束该内存才会释放)
3、静态工厂方法可以返回原返回类型的任何子类型的对象(这个还在研究中)
但是在遇到多个构造器参数,或者参数一开始无法确定的时候,无论用静态工厂方法或者构造器都是一件麻烦的事情,创造者必须要提供多个方法或者构造器,而且调用的时候还要小心看清每个参数。或者会选择用javabean模式(就是调用无参构造器,然后不断set值),但是这有个缺点:调用过程中javabean可能处于不一致的状态。
这时候你可以考虑Builder模式,它的参数可以再创建对象期间进行调整,也可随对象不同而改变,具体的列子可以看转自这位up主的代码
http://www.cnblogs.com/moonz-wu/archive/2011/01/11/1932473.html
不想去原博客看得可以看下面从他拿那到的例子:ps(在builder里给参数赋值的时候我发现我自己测试没有指明this的话会赋值失败,所以我自己加上了this,还有这里涉及成员内部类的知识,可以看这里http://android.blog.51cto.com/268543/384844/)
public class DoDoContact {
private final int age;
private final int safeID;
private final String name;
private final String address;
public int getAge() {
return age;
}
public int getSafeID() {
return safeID;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public static class Builder {
private int age = 0;
private int safeID = 0;
private String name = null;
private String address = null;
public Builder(String name) {
this.name = name;
}
public Builder age(int val) {
this.age = val;
return this;
}
public Builder safeID(int val) {
this.safeID = val;
return this;
}
public Builder address(String val) {
this.address = val;
return this;
}
public DoDoContact build() { // 构建,返回一个新对象
return new DoDoContact(this);
}
}
private DoDoContact(Builder b) {
age = b.age;
safeID = b.safeID;
name = b.name;
address = b.address;
}
}
//调用的代码:
DoDoContact ddc = new DoDoContact.Builder("Ace").age(10)
.address("beijing").build();
System.out.println("name=" + ddc.getName() + "age =" + ddc.getAge()
+ "address" + ddc.getAddress());