建造者模式
1.1什么是建造者模式
创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
指挥者(Director)直接和客户(Client)进行需求沟通,然后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder),将各个部件的建造请求委派到具体的建造者(ConcreteBuilder),各个具体建造者负责进行产品部件的构建,最终构建成具体产品(Product)。
例如以builder模式创建共享单车为例子:
//首先存在一个产品类(三个属性:支架、座位、轮胎)
public class Bike {
private IFrame frame;
private ISeat seat;
private ITire tire;
/*
getandset方法
*/
}
// 抽象 builder 类
public abstract class Builder {
//建造支架
abstract void buildFrame();
//建造座位
abstract void buildSeat();
//建造轮胎
abstract void buildTire();
建造车辆
abstract Bike createBike();
}
// 具体 builder 类
public class MobikeBuilder extends Builder{
private Bike mBike = new Bike();
@Override
void buildFrame() {
mBike.setFrame(new AlloyFrame());
}
@Override
void buildSeat() {
mBike.setSeat(new DermisSeat());
}
@Override
void buildTire() {
mBike.setTire(new SolidTire());
}
@Override
Bike createBike() {
return mBike;
}
}
public class OfoBuilder extends Builder{
private Bike mBike = new Bike();
@Override
void buildFrame() {
mBike.setFrame(new CarbonFrame());
}
@Override
void buildSeat() {
mBike.setSeat(new RubberSeat());
}
@Override
void buildTire() {
mBike.setTire(new InflateTire());
}
@Override
Bike createBike() {
return mBike;
}
}
//指挥者类传入具体的建造者类。
public class Director {
private Builder mBuilder = null;
public Director(Builder builder) {
mBuilder = builder;
}
public Bike construct() {
mBuilder.buildFrame();
mBuilder.buildSeat();
mBuilder.buildTire();
return mBuilder.createBike();
}
}
//客户端使用
public class Click {
public static void main(String[] args) {
showBike(new OfoBuilder());
showBike(new MobikeBuilder());
}
private void showBike(Builder builder) {
Director director = new Director(builder);
Bike bike = director.construct();
bike.getFrame().frame();
bike.getSeat().seat();
bike.getTire().tire();
}
}
1.2java中建造者模式的使用
java中的stringbuffer和StringBuilder、springMVC中UriComponents和UriComponentsBuilder。
1.3一般情境下应用:
假如我们需要构造一个包含10个属性,假如这十个属性都是可有可无的,那我们可能需要写很多个重复的set方法代码。但是我们可以使用创建一个Builder类,通过Builder类去创建所需要的类。假如我们需要一个Header类,这个Header具有属性clientid、correlationid等一系列函数。我们大概率会使用下面这种方法去赋值给Header类。
Header header = new Header();
header.setClientId(SOAHeader.SOAP_CLIENT_ID);
header.setCorrelationId(SOAHeader.SOAP_CORRELATION_ID);
。。。。。。
但是如果属性很多的话,就会显得代码重复切不便于阅读。我们可以采用下面的方法建造一个HeaderBuilder类。
public class HeaderBuilder {
protected BigInteger replyCd;
protected String clientId;
protected String recptId;
protected String transId;
protected String correlationId;
protected String userId;
protected String logTxt;
protected String replyMsg;
protected String systemName;
public HeaderBuilder setReplyCd(BigInteger replyCd) {
this.replyCd = replyCd;
return this;
}
public HeaderBuilder setClientId(String clientId) {
this.clientId = clientId;
return this;
}
public HeaderBuilder setRecptId(String recptId) {
this.recptId = recptId;
return this;
}
public HeaderBuilder setTransId(String transId) {
this.transId = transId;
return this;
}
public HeaderBuilder setCorrelationId(String correlationId) {
this.correlationId = correlationId;
return this;
}
public HeaderBuilder setUserId(String userId) {
this.userId = userId;
return this;
}
public HeaderBuilder setLogTxt(String logTxt) {
this.logTxt = logTxt;
return this;
}
public HeaderBuilder setReplyMsg(String replyMsg) {
this.replyMsg = replyMsg;
return this;
}
public HeaderBuilder setSystemName(String systemName) {
this.systemName = systemName;
return this;
}
public Header buildHeader(){
return new Header(replyCd, clientId, recptId, transId, correlationId, userId, logTxt, replyMsg, systemName);
}
}
那么在赋值Header类时。我们的代码就可以变为:
Header header = new HeaderBuilder()
.setClientId(SOAHeader.SOAP_CLIENT_ID)
.setCorrelationId(SOAHeader.SOAP_CORRELATION_ID)
.buildHeader();
这样可读性就大幅增加了。