转自:http://blog.csdn.net/liu136313/article/details/49874105
Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则。
我们有时候会写这样的实现类】
Student();
Student(String name);
Student(String name,int age);
Student(String name,int age,String address);
Student(String name,int age,String address,String ID);
为了满足不同的需求有时候必须要这样,把所有的构造函数都声明。这样书写很常见并且也比较有效率但是也存在很多不足,比如类的作者必须好把所有的构造函数都写上,而且在实例化的时候也要写默认值。比如new Student(“张三”,-1,"北京");年龄为-1肯定不符合常理,但是在实例化一个对象的时候必须要这种默认值,这是规范的要求否则直接报错了。如果没有使用setAge(int age)方法修改age的值,对于代码的后期维护和协同开发同伴使用肯定会是一件很痛苦的事情,因为根本不知道-1的含义是什么。这时候使用Builder模式就很有必要了。Builder模式就是使用一个代理完成对象的构建过程。这样的好处是易于扩展和类的使用,但同时失去了一些效率。
public class Student{
private String name;
private int age;
private String address;
private String ID;
private Student(Builder build){
this.name=build.name;
this.age=build.age;
this.address=build.address;
this.ID=build.ID;
}
public String getName(){
return this.name;
}
public String getAge(){
return this.age;
}
public String getAddress(){
return this.address;
}
public String getID(){
return this.ID;
}
public void method(){
System.out.println(name);
}
static class Builder{
private String name=null;
private int age=0;
private String address=null;
private String ID=null;
public Builder(){};
public Builder(String name){this.name=name}; //可以不写
public Builder setName(String name){this.name=name;return this;}
public Builder setAge(int age){this.age=age;return this;}
public Builder setAddress(String address){this.address=address;return this;}
public Builder setID(String ID){this.ID=ID;return this;}
public Student build(){return new Student(this)}
}
最后客户程序可以很灵活比如 Student student=new Student.Builder().setName("zhangsan").setAge(12).setAddress("beijing").build();
这样就可以调用 student.getName()和getAge()等方法了。这样写会丧失一定的效率但是代码易于扩展和使用。如果对student类进行了修改加入了新的成员变量,那么只需简单修改几行代码。如果不这样写构造函数可能要添加很多喽!因为构造函数参数个数和组合有很多种。。
}
==============================================================================================================================
这是github开源项目RoboBinding-album-sample-master的一个实体类:
public class Album
{
public static final int NO_ID = -1;
private long id;
private String title;
private String artist;
private boolean classical;
private String composer;
private Album(Builder builder)
{
validate(builder);
this.id = builder.id;
this.title = builder.title;
this.artist = builder.artist;
this.classical = builder.classical;
if (builder.isClassical())
{
this.composer = builder.composer;
}
}
private void validate(Builder builder)
{
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getTitle()
{
return title;
}
public String getArtist()
{
return artist;
}
public boolean isClassical()
{
return classical;
}
public String getComposer()
{
return composer;
}
@Override
public int hashCode()
{
return System.identityHashCode(id);
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Album other = (Album) obj;
if (id != other.id)
return false;
return true;
}
public boolean isNew()
{
return isNew(id);
}
public Builder createBuilder()
{
Builder builder = new Builder();
builder.setTitle(title);
builder.setArtist(artist);
builder.setClassical(classical);
builder.setComposer(composer);
builder.setId(id);
return builder;
}
public static boolean isNew(long albumId)
{
return albumId == NO_ID;
}
public static class Builder
{
private long id = NO_ID;
private String title;
private String artist;
private boolean classical;
private String composer;
public long getId()
{
return id;
}
public Builder setId(long id)
{
this.id = id;
return this;
}
public String getTitle()
{
return title;
}
public Builder setTitle(String title)
{
this.title = title;
return this;
}
public String getArtist()
{
return artist;
}
public Builder setArtist(String artist)
{
this.artist = artist;
return this;
}
public boolean isClassical()
{
return classical;
}
public Builder setClassical(boolean classical)
{
this.classical = classical;
return this;
}
public String getComposer()
{
return composer;
}
public Builder setComposer(String composer)
{
this.composer = composer;
return this;
}
public boolean isNew()
{
return Album.isNew(id);
}
public Album create()
{
return new Album(this);
}
}
}