比如: 一辆汽车是由多个部件组成的,包括了车轮、方向盘、发动机等等.对于大多数用户而言,并不需要知道这些部件的装配细节,并且几乎不会使用单独某个部件,而是使用一辆完整的汽车.而建造者模式就是负责将这些部件进行组装让后将完整的汽车返回给用户.
通过Builder接口,可以定制化自行车的实现,给自行车实例分类创建,从而减少创建步骤,创建出的自行车都是同一类型 Bike,但是他们的字段内容不同。这种方式个人理解为创建代码的模板化。
复制 @Data
public class Bike {
// 车架
private Frame frame;
// 车座
private Seat seat;
}
public abstract class Builder {
protected Bike mBike = new Bike();
public abstract void buildFrame();
public abstract void buildSeat();
public abstract Bike buildBike();
}
public class MobikeBuilder extends Builder {
@Override
public void buildFrame() {
this.mBike.setFrame(new Frame(xxx));
}
@Override
public void buildSeat() {
this.mBike.setSeat(new Seat(xxx));
}
@Override
public Bike buildBike(){
// 校验
return this;
}
}
public class Director {
private Builder mBuilder;
public Director(Builder builder) {
this.mBuilder = builder;
}
public Bike construct() {
mBuilder.buildFrame();
mBuilder.buildSeat();
return mBuilder.buildBike();
}
}
public static void main(String[] args) {
Director director = mew Director(new MobikeBuilder());
Bike bike = director.construct();
}
复制 public class RabbitMQClient {
// 私有化构造器,让该对象只能通过Builder来构造
private RabbitMQ3(Builder builder) {
}
public static class Builder {
// 保证属性的密闭性
private String host = "127.0.0.1";
private int port = 5672;
private int mode;
private String exchange;
private String queue;
private boolean isDurable = true;
public Builder host(String host) {
this.host = host;
return this;
}
public Builder port(int port) {
this.port = port;
return this;
}
public Builder mode(int mode) {
this.mode = mode;
return this;
}
public Builder exchange(String exchange) {
this.exchange = exchange;
return this;
}
public Builder queue(String queue) {
this.queue = queue;
return this;
}
public Builder isDurable(boolean isDurable) {
this.isDurable = isDurable;
return this;
}
public RabbitMQClient build() {
// 校验逻辑
// ......
return new RabbitMQClient(this);
}
}
}
Mybatis SqlSessionFactoryBuilder
复制 public class SqlSessionFactoryBuilder {
public SqlSessionFactory build(Reader reader) {
return build(reader, null, null);
}
public SqlSessionFactory build(Reader reader, String environment) {
return build(reader, environment, null);
}
public SqlSessionFactory build(Reader reader, Properties properties) {
return build(reader, null, properties);
}
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
public SqlSessionFactory build(InputStream inputStream) {
return build(inputStream, null, null);
}
public SqlSessionFactory build(InputStream inputStream, String environment) {
return build(inputStream, environment, null);
}
public SqlSessionFactory build(InputStream inputStream, Properties properties) {
return build(inputStream, null, properties);
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
}
类似的还有 XMLConfigBuilder
、XMLMapperBuilder
,在他们的内部会有大量的创建逻辑,是极其复杂的。