两天一种设计模式之——建造者模式

一、简介

建造者模式(Builder Pattern)使用一个个简单的对象一步步的构建成一个复杂的对象,建造者模式同样属于创建类模型。建造者模式隐藏了复杂对象的创建过程,使用者只需告知建造者其需要什么即可。建造者模式适于基本组件不变,但是基本组件的组合常常改变的场景。

建造者模式的UML类图
在这里插入图片描述

二、建造者模式的一个实例

在这个实例中,使用建造者模式来描述客厅的装修。客厅装修中,应当包括墙面、电视和沙发,客户将自己的需求告知项目经理,经理指挥工人进行装饰。

  1. 绘制UML类图
    在实现代码之前,我们先将需求转化为UML类图的形式进行描述,以便编写代码时参考。
    在这里插入图片描述
  2. 代码实现
  • Pruduct类
    Product类中定义了产品的种类,提供了设置产品组件的方法,并提供了show()方法以便查看运行效果。
package builder;

public class Product {
    private String wall;
    private String tv;
    private String sofa;


    public void setWall(String wall) {
        this.wall = wall;
    }

    public void setTv(String tv) {
        this.tv = tv;
    }


    public void setSofa(String sofa) {
        this.sofa = sofa;
    }

    public void show() {
        System.out.println("Product{" +
                "wall='" + wall + '\'' +
                ", tv='" + tv + '\'' +
                ", sofa='" + sofa + '\'' +
                '}');
    }
}

  • Buidler类
    Builder类抽象出了具体建造者需要进行的操作,并负责将产品返回。
package builder;

public abstract class Builder{
    protected Product product = new Product();

    public abstract void builderWall();
    public abstract void builderTV();
    public abstract void builderSofa();
    public Product getResult(){
        return product;
    }
}
  • Director 类
    Director类负责指挥builder进行产品组装,并向客户返回产品。
package builder;

public class Director {
    private Builder builder;

    public Director(Builder builder){
        this.builder = builder;
    }

    public Product construct(){
        builder.builderWall();
        builder.builderTV();
        builder.builderSofa();
        return builder.getResult();
    }
}
  • ConcreteBuilderA 类
    ConcreteBuilderA类,具体的一个建造者,实现了Builder提供的建造方法,使Builder中的产品落地。
package builder;

public class ConcreteBuilderA extends Builder{
    @Override
    public void builderWall() {
        product.setWall("白墙");
    }

    @Override
    public void builderTV() {
        product.setTv("小米电视");
    }

    @Override
    public void builderSofa() {
        product.setSofa("木质沙发");
    }
}

  • ConcreteBuilderB 类
    ConcreteBuilderB类,作用与ConcreteBuilderA类相同,但是其实现Builder方法产生的产品不同于ConcreteBuilderA类产生的产品。
package builder;

public class ConcreteBuilderB extends Builder{
    @Override
    public void builderWall() {
        product.setWall("砖面墙");
    }

    @Override
    public void builderTV() {
        product.setTv("海尔电视");
    }

    @Override
    public void builderSofa() {
        product.setSofa("真皮沙发");
    }
}
  • Client 类
    Client类,客户,向Director提需求的人
package builder;

public class Client {
    public static void main(String[] args) {

        Builder builder = new ConcreteBuilderA();

        //Builder builder = new ConcreteBuilderB();

        Director director = new Director(builder);

        Product product = director.construct();

        product.show();
    }
}

运行结果

客户选择ConcreteBuilderA类的效果
在这里插入图片描述
客户选择ConcreteBuilderB类的效果
在这里插入图片描述

三、总结

在上面的实例中可以发现。一个客厅要装饰的地方大体相同(墙、电视以及沙发),而采用不同的创建方案,却是有着不同的效果。客户无需知道具体的创建过程,因为复杂的创建过程由具体的建造者以及Director完成。客户仅仅只需要知道它需要哪个具体建造者并告知Director就可以得到一个复杂的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值