上次说用静态工厂方法来代替构造器,好处有几点:
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());