建造者模式

建造者模式

建造者模式,也叫生成器模式,可以理解成可以分步骤创建一个复杂的对象。在该模式中允许使用相同的创建代码生成不同类型和形式的对象。

对象定义

  • Product(产品类) :我们具体需要生成的类对象

  • Builder(抽象建造者类):为我们需要生成的类对象,构建不同的模块属性,即:公开构建产品类的属性,隐藏产品类的其他功能。

  • ConcreteBuilder(具体建造者类):实现抽象类定义的所有方法,并返回一个组建好的对象。

  • Director(导演类):确定构建我们的类对象具体有哪些模块属性,在实际应用中可以不需要这个角色,直接通过client处理。

优缺点

优点

  1. 产品的建造和表示分离,实现了解耦,可以使用相同的创建过程得到不同的产品。
  2. 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
  3. 增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。

缺点

  1. 产品必须有共同点,限制了使用范围。建造者模式创造出来的产品,其组成部分基本相同。
  2. 产生多余的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等信息。


文章作者: 凌云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 凌云 !
  目录