设计模式之建造者模式

建造者模式是一种设计模式,用于将复杂对象的构建与其表示分离,允许创建不同的表示。通过一个导演类来指导具体建造者构建产品,如在电脑组装的例子中,不同配置的电脑对应不同的建造者实现。这种模式适用于当对象的构造过程复杂且需要多种构造方式的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是建造者模式

看到建造,就能看出这是跟创建对象有关的,那么作用呢?官方给出的答案是:

将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示

有点抽象,举个生活中的例子吧。年少有为的你在所在的城市买了一套房,准备着手装修,但是要装修成什么风格呢,很苦恼,索性就找了个设计师,让他帮你设计。设计师接下了单子,很快就给看了几套设计方案,你觉得都不错,都想要,可是你只有一套房子,没办法,只能再买一套满足自己了。于是你分别联系好了装修人员,将两个设计方案给了他,装修人员便按照设计方案分别给这两套房装修。
总结一下,你要装修房子,这相当于一个复杂对象的构建,你给了装修工人不同的设计方案,就呈现出了不一样的表示,也就是构建出来的效果不一样。

建造者模式有以下四种角色:

Product: 最终要生成的对象
Builder: 构建者的抽象基类(有时会使用接口代替)。其定义了构建Product的抽象步骤,其实体类需要实现这些步骤。其会包含一个用来返回最终产品的方法Product getProduct()。
ConcreteBuilder: Builder的实现类。
Director: 决定如何构建最终产品的算法. 其会包含一个负责组装的方法void Construct(Builder builder), 在这个方法中通过调用builder的方法,就可以设置builder,等设置完成后,就可以通过builder的 getProduct() 方法获得最终的产品。

建造者模式的代码实现

就拿我们去电脑城组装电脑的例子来说,首先创建我们的Product,也就是电脑

public class Computer {
    
    private String mainboard;
    private String cpu;
    private String ram;
    private String display;
    private String master;

    public void setMainboard(String mainboard) {
        this.mainboard = mainboard;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public void setRam(String ram) {
        this.ram = ram;
    }

    public void setDisplay(String display) {
        this.display = display;
    }

    public void setMaster(String master) {
        this.master = master;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "mainboard='" + mainboard + '\'' +
                ", cpu='" + cpu + '\'' +
                ", ram='" + ram + '\'' +
                ", display='" + display + '\'' +
                ", master='" + master + '\'' +
                '}';
    }
}

然后就是我们的builder

public interface Builder {
    
    public void setMainboard();
    public void setCpu();
    public void setRam();
    public void setDisplay();
    public void setMaster();
    public Computer getComputer();
    
}

之后就是ConcreteBuilder,我们来个中配和高配电脑
首先是中配电脑

public class MediumBulider implements Builder {

    private Computer computer;

    public MediumBulider(){
        computer=new Computer();
    }
    @Override
    public void setMainboard() {
        computer.setMainboard("中级的主板");
    }

    @Override
    public void setCpu() {
        computer.setCpu("中级的cpu");
    }

    @Override
    public void setRam() {
        computer.setRam("中级的内存");
    }

    @Override
    public void setDisplay() {
        computer.setDisplay("中级的显示器");
    }

    @Override
    public void setMaster() {
        computer.setMaster("中级的主机");
    }

    @Override
    public Computer getComputer() {
        return this.computer;
    }
}

再来个高配的

public class HighBuilder implements Builder {

    private Computer computer;

    public HighBuilder(){
        computer=new Computer();
    }
    @Override
    public void setMainboard() {
        computer.setMainboard("高级的主板");
    }

    @Override
    public void setCpu() {
        computer.setCpu("高级的cpu");
    }

    @Override
    public void setRam() {
        computer.setRam("高级的内存");
    }

    @Override
    public void setDisplay() {
        computer.setDisplay("高级的显示器");
    }

    @Override
    public void setMaster() {
        computer.setMaster("高级的主机");
    }

    @Override
    public Computer getComputer() {
        return this.computer;
    }
}

还需要个Director

public class Directoer {
    public void construt(Builder builder){
        builder.setCpu();
        builder.setDisplay();
        builder.setMainboard();
        builder.setMaster();
        builder.setRam();
    }
}

这样我们四个角色就创建好了,测试一下

    @Test
    public void shouldAnswerWithTrue()
    {
        Builder builder=new MediumBulider();
        Builder builder2=new HighBuilder();
        Directoer directoer=new Directoer();
        directoer.construt(builder);
        directoer.construt(builder2);
        Computer mdcomputer=builder.getComputer();
        Computer Hgcomputer=builder2.getComputer();
        System.out.println(mdcomputer);
        System.out.println(Hgcomputer);
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值