设计模式之建造者模式

建造者模式

建造者模式属于创建者模式,提供了一个创建对象的方式,用户只需给出制定复杂对象的类型,建造者负责按顺序创建复杂对象(隐藏构造细节)

场景:包工头指挥工人建造房子,按照(1)地基(2)钢筋工程(3)铺电线(4)粉刷,其中有三个角色:包工头(指挥者)工人(具体的建造者)房子(产品)

//抽象建造者
public abstract class Builder {
    public abstract void buildA();
    public abstract void buildB();
    public abstract void buildC();
    public abstract void buildD();

    public abstract Product getProduct();
}

//产品:房子
public class Product {
    private String buildA;
    private String buildB;
    private String buildC;
    private String buildD;

    public void setBuildA(String buildA) {
        this.buildA = buildA;
        System.out.println("地基");
    }

    public void setBuildB(String buildB) {
        this.buildB = buildB;
        System.out.println("钢筋工程");
    }

    public void setBuildC(String buildC) {
        this.buildC = buildC;
        System.out.println("铺电线");
    }

    public void setBuildD(String buildD) {
        this.buildD = buildD;
        System.out.println("粉刷");
    }

    @Override
    public String toString() {
        return "Product{" +
                "buildA='" + buildA + '\'' +
                ", buildB='" + buildB + '\'' +
                ", buildC='" + buildC + '\'' +
                ", buildD='" + buildD + '\'' +
                '}';
    }
}

//工人
public class Worker extends Builder {

    private Product product;

    public Worker() {
        this.product = new Product();
    }

    @Override
    public void buildA() {
        product.setBuildA("地基");
    }

    @Override
    public void buildB() {
        product.setBuildB("钢筋工程");
    }

    @Override
    public void buildC() {
        product.setBuildC("铺电线");
    }

    @Override
    public void buildD() {
        product.setBuildD("粉刷");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}
//指挥者
public class Director {
    public Product builder(Builder builder) {

        builder.buildA();
        builder.buildB();
        builder.buildC();
        builder.buildD();

        return builder.getProduct();
    }

    public static void main(String[] args) {
        Director director = new Director();
        Product builder = director.builder(new Worker());
        System.out.println(builder.toString());
    }
}

上面这种方式是建造者模式常规的用法,Director起着重要作用,用于指导具体构建者如何构建产品,规定了构建顺序,但是有些情况相爱需要简化系统结构,可以把Director省略,通过一种链式构造对象,这种方式可以实现自定义构建顺序,把指挥这一角色交给用户

场景:麦当劳套餐,服务员(具体建造者)可以随意搭配任意几种产品组成一款套餐(产品),然后出售给用户

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

    public abstract  Product getProduct();
}

public class Product {
    //默认套餐
    private String buildA = "汉堡";
    private String buildB = "薯条";
    private String buildC = "可乐";
    private String buildD = "鸡翅";

    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }

    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }

    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }

    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }

    @Override
    public String toString() {
        return "Product{" +
                "buildA='" + buildA + '\'' +
                ", buildB='" + buildB + '\'' +
                ", buildC='" + buildC + '\'' +
                ", buildD='" + buildD + '\'' +
                '}';
    }
}

public class Worker extends Builder {

    private Product product;

    public Worker() {
        this.product = new Product();
    }

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

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

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

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


    @Override
    public Product getProduct() {
        return product;
    }
}
public class Test{

    public static void main(String[] args) {
        //默认套餐
        Worker worker1 = new Worker();
        Product product = worker1.getProduct();
        System.out.println(product.toString());

        //自定义套餐
        Worker worker2 = new Worker();
        worker2.buildA("全家桶").buildB("甜点");
        System.out.println(worker2.getProduct());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值