当一个类的参数多的情况下,使用重叠构造器模式客户端代码会很难编写,并且可读性差;使用javabean模式,调用一个无参的构造器,然后调用setter方法来设置每个必要的参数。但是javabean自身有着严重的缺点,因为构造过程被分到几个调用中,在构造javabean可能处于不一致的状态,类无法仅仅通过检验构造器参数的有效性来保证一致性。另一点不足之处,javabean模式阻止了把类做成不可变的可能,这就需要程序员付出额外的努力来确保他的线程安全; build模式 既能保证像重叠构造器那样的安全,也能实现JavaBean模式那样的可读性。
使用build模式的步骤:
(1)不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个build对象。
(2)然后让客户端在build对象上调用类似的setter方法来设置每个相关的可选参数,
(3)最后,客户端调用无参的build方法来生成不可变的对象。这个builder是它构建的静态成员类。
实例:
package com.bh.realTimeMonitor.entity;
/**
设备实体类
* @author 崔耀强 20150507-20150822
* @version 1.1
* */
import java.util.ArrayList;
public class Equipment {
private int id; //设备id
private String name; //设备的名称
private String location; //位置信息
private double coordinateX; // 坐标x
private double coordinateY; // 坐标y
private EquipmentType equipmentType; //设备类型
private String IP; //IP
private String port; //端口号
private int module; //属于哪个模块(设备连接和位置区分)
private int subSysId; //属于哪个子系统
private String health; //设备健康值
private int netWorkState; //网络情况
private ArrayList<BusinessValue> value;
public ArrayList<BusinessValue> getValue() {
return value;
}
public void setValue(ArrayList<BusinessValue> value) {
this.value = value;
}
public int getNetWorkState() {
return netWorkState;
}
public void setNetWorkState(int netWorkState) {
this.netWorkState = netWorkState;
}
public String getHealth() {
return health;
}
public void setHealth(String health) {
this.health = health;
}
public int getCoordinateInterfaceID() {
return module;
}
public void setCoordinateInterfaceID(int coordinateInterfaceID) {
module = coordinateInterfaceID;
}
public String getIP() {
return IP;
}
public void setIP(String iP) {
IP = iP;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public EquipmentType getEquipmentType() {
return equipmentType;
}
public void setEquipmentType(EquipmentType equipmentType) {
this.equipmentType = equipmentType;
}
public double getCoordinateX() {
return coordinateX;
}
public void setCoordinateX(double coordinateX) {
this.coordinateX = coordinateX;
}
public double getCoordinateY() {
return coordinateY;
}
public void setCoordinateY(double coordinateY) {
this.coordinateY = coordinateY;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public Equipment(int id, String location ) {
this.id = id;
this.location = location;
}
public int getModleID() {
return subSysId;
}
public void setModleID(int modleID) {
this.subSysId = modleID;
}
public static class Builder {
private int id; //设备id
private String name; //shebei的名称
private String location; //位置信息
private double coordinateX; // 坐标x
private double coordinateY; // 坐标y
private EquipmentType equipmentType; //设备类型
private String IP; //IP
private String port; //端口号
private int module; //属于哪个模块(设备连接和位置区分)
private int subSysId; //属于哪个子系统
private String health; //设备健康值
private int netWorkState; //网络情况
private ArrayList<BusinessValue> value;
public Builder(int id, String name,EquipmentType equipmentType,String location) {
super();
this.id = id;
this.name = name;
this.equipmentType = equipmentType;
this.location = location;
}
public Builder coordinate_X(double coordinate_X) {
this.coordinateX = coordinate_X;
return this;
}
public Builder coordinate_Y(double coordinate_Y) {
this.coordinateY = coordinate_Y;
return this;
}
public Builder iP(String iP) {
IP = iP;
return this;
}
public Builder port(String port) {
this.port = port;
return this;
}
public Builder module(int module) {
this.module = module;
return this;
}
public Builder subSysId(int subSysId) {
this.subSysId = subSysId;
return this;
}
public Builder health(String health) {
this.health = health;
return this;
}
public Builder netWorkState(int netWorkState) {
this.netWorkState = netWorkState;
return this;
}
public Builder value(ArrayList<BusinessValue> value) {
this.value = value;
return this;
}
public Equipment build() {
return new Equipment(this);
}
}
private Equipment(Builder builder) {
id = builder.id;
name = builder.name;
location = builder.location;
coordinateX = builder.coordinateX;
coordinateY = builder.coordinateY;
equipmentType = builder.equipmentType;
IP = builder.IP;
port = builder.port;
module = builder.module;
subSysId = builder.subSysId;
health = builder.health;
netWorkState = builder.netWorkState;
value = builder.value;
}
public Equipment() {
super();
}
}