23种设计模式之建造者模式(Builder Pattern)

文章介绍了建造者模式的概念,它是创建型设计模式的一种,用于将复杂对象的构建步骤分离,实现不同表示的创建。建造者模式优点在于简化代码和实现多样化构建,但可能增加代码维护复杂性。文中通过电脑组装的例子展示了如何使用建造者模式构建不同品牌的电脑对象。
摘要由CSDN通过智能技术生成

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的建造者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始

在这里插入图片描述

建造者模式概念

建造者模式是一种创建型设计模式,它允许我们将一个复杂对象的构建步骤分离出来,使得同样的构建过程可以创建不同的表示。该模式的目的是将构建复杂对象的过程抽象化,从而减少代码的重复和复杂度

在建造者模式中,我们通过Builder接口或抽象类定义了一个标准的构建流程,然后让不同的具体构造者按照这个标准来实现自己的构建流程。同时,我们还定义了一个指导者(Director)类,用于按照特定的顺序执行构建流程,从而完成对象的构建。

建造者模式优缺点

建造者模式的优点在于:

  1. 将构建复杂对象的过程封装起来,简化了代码结构和逻辑。

  2. 不同的具体构造者可以实现不同的构建流程,使得同样的构建过程可以创建不同的表示。

  3. 指导者类可以根据需要按照特定的顺序执行构建流程,从而达到更好的控制和管理对象的构建。

建造者模式的缺点在于:

  1. 添加新的部件需要修改抽象类和具体构造者的代码。

  2. 如果对象的属性较少,使用建造者模式可能会显得过于复杂,不如直接使用工厂方法模式或简单工厂模式。

总之,建造者模式适用于需要创建对象复杂且变化多端的情景,它能够将对象的构建过程标准化,从而达到代码重用和简化的目的。

建造者模式案例

首先我们创建一个电脑抽象类Computer和各个部件的抽象类Part,其中包含它们的基本属性及get和set方法。

public abstract class Computer {
    protected String mBoard;
    protected String mCpu;
    protected String mRam;
    protected String mHardDisk;

    public void setBoard(String board) {
        this.mBoard = board;
    }

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

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

    public void setHardDisk(String hardDisk) {
        this.mHardDisk = hardDisk;
    }

    public abstract String toString();
}

public abstract class Part {
    protected String mName;

    public void setName(String name) {
        this.mName = name;
    }

    public String getName() {
        return mName;
    }
}

然后我们定义一个Builder接口,包含构建各个部件的方法,如buildBoard、buildCpu等。

public interface Builder {
    void buildBoard(String board);
    void buildCpu(String cpu);
    void buildRam(String ram);
    void buildHardDisk(String hardDisk);
    Computer createComputer();
}

接着我们定义三种不同的具体构造者:AsusBuilder、DellBuilder和HPBuilder,它们分别实现了Builder接口,并且实现了构建各个部件的方法,根据不同的要求返回不同的部件对象。

public class AsusBuilder implements Builder {
    private Computer mComputer = new AsusComputer();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    public void buildCpu(String cpu) {
        mComputer.setCpu(cpu);
    }

    @Override
    public void buildRam(String ram) {
        mComputer.setRam(ram);
    }

    @Override
    public void buildHardDisk(String hardDisk) {
        mComputer.setHardDisk(hardDisk);
    }

    @Override
    public Computer createComputer() {
        return mComputer;
    }
}

public class DellBuilder implements Builder {
    private Computer mComputer = new DellComputer();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    public void buildCpu(String cpu) {
        mComputer.setCpu(cpu);
    }

    @Override
    public void buildRam(String ram) {
        mComputer.setRam(ram);
    }

    @Override
    public void buildHardDisk(String hardDisk) {
        mComputer.setHardDisk(hardDisk);
    }

    @Override
    public Computer createComputer() {
        return mComputer;
    }
}

public class HPBuilder implements Builder {
    private Computer mComputer = new HPComputer();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    public void buildCpu(String cpu) {
        mComputer.setCpu(cpu);
    }

    @Override
    public void buildRam(String ram) {
        mComputer.setRam(ram);
    }

    @Override
    public void buildHardDisk(String hardDisk) {
        mComputer.setHardDisk(hardDisk);
    }

    @Override
    public Computer createComputer() {
        return mComputer;
    }
}

最后我们定义一个Director类,它含有一个Builder对象,以及按照固定的顺序执行构建流程的方法buildComputer。通过调用Director的buildComputer方法,我们便可以创建出一个完整的电脑对象。

public class Director {
    private Builder mBuilder;

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

    public void buildComputer(String board, String cpu, String ram, String hardDisk) {
        mBuilder.buildBoard(board);
        mBuilder.buildCpu(cpu);
        mBuilder.buildRam(ram);
        mBuilder.buildHardDisk(hardDisk);
    }
}

最后我们定义三个具体的电脑类AsusComputer、DellComputer和HPComputer,它们分别继承自Computer抽象类,实现了toString方法,用于打印电脑对象的属性。

public class AsusComputer extends Computer {
    @Override
    public String toString() {
        return "Asus Computer [Board=" + mBoard + ", CPU=" + mCpu + ", RAM=" + mRam + ", HardDisk="
                + mHardDisk + "]";
    }
}
public class DellComputer extends Computer {
    @Override
    public String toString() {
        return "Dell Computer [Board=" + mBoard + ", CPU=" + mCpu + ", RAM=" + mRam + ", HardDisk="
                + mHardDisk + "]";
    }
}

public class HPComputer extends Computer {
    @Override
    public String toString() {
        return "HP Computer [Board=" + mBoard + ", CPU=" + mCpu + ", RAM=" + mRam + ", HardDisk="
                + mHardDisk + "]";
    }
}

这样我们便完成了建造者模式的实现,可以通过下面的代码进行测试:

public class Client {
    public static void main(String[] args) {
        Builder asusBuilder = new AsusBuilder();
        Builder dellBuilder = new DellBuilder();

        Director director = new Director(asusBuilder);
        director.buildComputer("Asus Board", "Intel i7-8700K", "16GB DDR4", "1TB SSD");
        Computer asusComputer = asusBuilder.createComputer();
        System.out.println(asusComputer.toString());

        director = new Director(dellBuilder);
        director.buildComputer("Dell Board", "Intel Xeon E-2224G", "32GB DDR4", "2x 512Gb NVMe SSD");
        Computer dellComputer = dellBuilder.createComputer();
        System.out.println(dellComputer.toString());
    }
}

输出结果如下:

Asus Computer [Board=Asus Board, CPU=Intel i7-8700K, RAM=16GB DDR4, HardDisk=1TB SSD]
Dell Computer [Board=Dell Board, CPU=Intel Xeon E-2224G, RAM=32GB DDR4, HardDisk=2x 512Gb NVMe SSD]

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小威要向诸佬学习呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值