04 设计模式 建造者模式

建造者模式

建造者模式就好像盖一栋房子,需要有设计师,图纸,施工队以及成品,

在这其中:

  • 设计师负责确定流程
  • 图纸是一个施工的描述
  • 施工队是具体的动作
  • 成品是最后的结果

图例如下:

image-20200619160103404

成品类:

@Data
@ToString
public class Product {
    String buildA = "默认值A";
    String buildB = "默认值B";
    String buildC = "默认值C";
    String buildD = "默认值D";
}

上面的成品类就是最终的产品所需要具备的属性,我把它理解为实体类

图纸类:

public abstract class Builder {
    abstract Builder buildA(String msg);
    abstract Builder buildB(String msg);
    abstract Builder buildC(String msg);
    abstract Builder buildD(String msg);

    abstract Product getProduct();
}

Builder就是一个对施工队的抽象,也就在一个工程中所需要的步骤,没有具体的实现

施工队类:

public class Worker extends Builder{
    Product product;

    Worker(){product = new Product();}

    @Override
    Builder buildA(String msg) {
        product.setBuildA(msg);
        return this;
    }

    @Override
    Builder buildB(String msg) {
        product.setBuildB(msg);
        return this;
    }

    @Override
    Builder buildC(String msg) {
        product.setBuildC(msg);
        return this;
    }

    @Override
    Builder buildD(String msg) {
        product.setBuildD(msg);
        return this;
    }

    @Override
    Product getProduct() {return product;}
}

施工队类是Builder的实现类,确定了Builder中步骤的具体操作

导演类:

public class Director {
    public static Product build(Builder builder){
        return builder.getProduct();
    }
    public static Product build(Builder builder, String msg1){
        builder.buildA(msg1).getProduct();
        return builder.getProduct();
    }
    public static Product build(Builder builder, String msg1, String msg2){
        return builder.buildA(msg1).buildB(msg2).getProduct();
    }
    public static Product build(Builder builder, String msg1, String msg2, String msg3){
        return builder.buildA(msg1).buildB(msg2).buildC(msg3).getProduct();
    }
    public static Product build(Builder builder, String msg1, String msg2, String msg3, String msg4){
        return builder.buildA(msg1).buildB(msg2).buildC(msg3).buildD(msg4).getProduct();
    }

}

其用于指导具体的施工队如何施工,控制先后次序等

测试类:

public static void main(String[] args) {
        System.out.println(Director.build(new Worker()));
        System.out.println(Director.build(new Worker(),"这是第一个参数"));
        System.out.println(Director.build(new Worker(),"这是第一个参数","这是第二个参数"));
        System.out.println(Director.build(new Worker(),"这是第一个参数","这是第二个参数","这是第三个参数"));
        System.out.println(Director.build(new Worker(),"这是第一个参数","这是第二个参数","这是第三个参数","这是第四个参数"));
    }
}

结果如下:

Product{buildA='默认值A', buildB='默认值B', buildC='默认值C', buildD='默认值D'}
Product{buildA='这是第一个参数', buildB='默认值B', buildC='默认值C', buildD='默认值D'}
Product{buildA='这是第一个参数', buildB='这是第二个参数', buildC='默认值C', buildD='默认值D'}
Product{buildA='这是第一个参数', buildB='这是第二个参数', buildC='这是第三个参数', buildD='默认值D'}
Product{buildA='这是第一个参数', buildB='这是第二个参数', buildC='这是第三个参数', buildD='这是第四个参数'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值