建造者模式
建造者模式,也叫生成器模式,可以理解成可以分步骤创建一个复杂的对象。在该模式中允许使用相同的创建代码生成不同类型和形式的对象。
对象定义
Product(产品类) :我们具体需要生成的类对象
Builder(抽象建造者类):为我们需要生成的类对象,构建不同的模块属性,即:公开构建产品类的属性,隐藏产品类的其他功能。
ConcreteBuilder(具体建造者类):实现抽象类定义的所有方法,并返回一个组建好的对象。
Director(导演类):确定构建我们的类对象具体有哪些模块属性,在实际应用中可以不需要这个角色,直接通过client处理。
优缺点
优点
- 产品的建造和表示分离,实现了解耦,可以使用相同的创建过程得到不同的产品。
- 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
- 增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
缺点
- 产品必须有共同点,限制了使用范围。建造者模式创造出来的产品,其组成部分基本相同。
- 产生多余的builder对象以及director对象,消耗内存。
DEMO
Product
public class Product {
private String reader;
private String writer;
private String setting;
}
Builder
public interface Builder {
public void buildReader(String val);
public void buildWriter(String val);
public void buildSetting(String val);
public Product getJson();
}
ConcreteBuilder
public class ConcreteBuilder implements Builder{
Product dataJson = new Product();
@Override
public void buildReader(String val) {
dataJson.setReader(val);
}
@Override
public void buildWriter(String val) {
dataJson.setWriter(val);
}
@Override
public void buildSetting(String val) {
dataJson.setSetting(val);
}
@Override
public Product getJson() {
return dataJson;
}
}
Director
public class Director {
//模拟 mysql -> hive
public Product buildMysqlJson(Builder builder){
builder.buildReader("mysql");
builder.buildWriter("hive");
builder.buildSetting("setting");
return builder.getJson();
}
//模拟 oracle -> hive
public Product buildOracleJson(Builder builder){
builder.buildReader("oracle");
builder.buildWriter("hive");
builder.buildSetting("setting");
return builder.getJson();
}
}
Client
public class Client {
public static void main(String[] args) {
Director director = new Director();
Product productMysql = director.buildMysqlJson(new ConcreteBuilder());
System.out.println(productMysql.toString());
Product productOracle = director.buildOracleJson(new ConcreteBuilder());
System.out.println(productOracle.toString());
}
}
场景
在日常开发中我们能经常用到Builder设计模式,最常见的就是核心程序中的StringBuilder了,在开源框架中我们也经常能够看到,例如Mybatis中的SqlSourceBuilder、XMLConfigBuilder等信息。