设计模式--建造者模式 builder

建造者模式简介

建造者模式有四个角色,概念划分如下:

  • Product : 产品类,最终要生成的对象(例如:一台电脑)。
  • Builder :构建者的抽象基类或则抽象接口。定义了Product产品的生产流程的抽象步骤(比如一台电脑可以在出厂的时候就将所有外设配件搭载齐全,也可以只是原装的一台电脑,外设需要自己从别的地方购买)。
  • ConcreteBuilder :Builder的实现类。
  • Direcotr : 决定如何构建最终产品的算法逻辑,多个方法Construct(Builder builder){//方法体}(例如:你是要买一台外设齐全的电脑,还是一台没有任何外设的原装电脑),最后通过Builder.getProduct()获得最终的产品。

类图如下(直接将韩老师的图拿过来了):
在这里插入图片描述

建造者模式–小例子(电脑购买)

购买一台电脑,可以买完整的包括所有外设的电脑,也可以买只有电脑本身无任何外设配件的电脑(且电脑品牌很多,联想华硕,可以自行选择电脑的cpu和主板,若买外设配件时,则根据购买电脑品牌来添加对应品牌外设)。
在这里插入图片描述

1.产品类

电脑CPU和主板都为必选,其余外设可不选。

package com.robin.builder;

// 一台完整的电脑产品
public class Computer {

    private String cpu; // cpu 必选
    private String mouse; // 鼠标 可选
    private String monitor; // 屏幕显示器 可选
    private String keyBoard; // 键盘 可选
    private String mainBoard; // 主板 必选


    // cpu和主板为必选,其余配件可以自行选择
    public Computer(String cpu, String mainBoard) {
        this.cpu = cpu;
        this.mainBoard = mainBoard;
    }

    // 对可选的配件提供setter方法
    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    public void setMonitor(String monitor) {
        this.monitor = monitor;
    }

    public void setKeyBoard(String keyBoard) {
        this.keyBoard = keyBoard;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", mouse='" + mouse + '\'' +
                ", monitor='" + monitor + '\'' +
                ", keyBoard='" + keyBoard + '\'' +
                ", mainBoard='" + mainBoard + '\'' +
                '}';
    }
}

2.抽象构建者

抽象构建者:

package com.robin.builder;

// 抽象构建者
public abstract class ComputerBuilder {

    public abstract Computer getComputer();

    public abstract void setMouse();

    public abstract void setMonitor();

    public abstract void setKeyBoard();

}

3.实体构建类

两个不同品牌的电脑实体构建类:

联想:

package com.robin.builder;

// 品牌电脑实体构建者类
public class LenovoComputerBuilder extends ComputerBuilder{

    private Computer computer;

    public LenovoComputerBuilder(String cpu, String mainBoard) {
        computer = new Computer(cpu, mainBoard);
    }

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

    @Override
    public void setMouse() {
        computer.setMouse("[lenovo]鼠标");
    }

    @Override
    public void setMonitor() {
        computer.setMonitor("[lenovo]240Hz高刷显示器");
    }

    @Override
    public void setKeyBoard() {
        computer.setKeyBoard("[lenovo]机械键盘");
    }
}

华硕:

package com.robin.builder;

public class ASUSComputerBuilder extends ComputerBuilder{

    private Computer computer;

    public ASUSComputerBuilder(String cpu,String mainBoard) {
        computer = new Computer(cpu, mainBoard);
    }

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

    @Override
    public void setMouse() {
        computer.setMouse("[华硕]鼠标");
    }

    @Override
    public void setMonitor() {
        computer.setMonitor("[华硕]显示屏");
    }

    @Override
    public void setKeyBoard() {
        computer.setKeyBoard("[华硕]机械键盘");
    }
}

4.指导者类

通过两个方法来确定,创建(购买)何种类型包含何种配件。

package com.robin.builder;

public class ComputerDirector {

    // 包含所有完整配件的电脑
    public void buyCompleteComputer(ComputerBuilder computerBuilder){
        computerBuilder.setMouse();
        computerBuilder.setKeyBoard();
        computerBuilder.setMonitor();
    }

    // 无配件的电脑
    public void buyNoAcesComputer(ComputerBuilder computerBuilder){}
}

5.客户端测试类

package com.robin.builder;

public class Main {
    public static void main(String[] args) {
        // 1.创建指挥者
        ComputerDirector computerDirector = new ComputerDirector();
        // 2.创建实体构造者
        LenovoComputerBuilder lenovoComputerBuilder = new LenovoComputerBuilder("i9", "QDI");
        // 3.指挥者调用构造者去设定电脑配件
        computerDirector.buyCompleteComputer(lenovoComputerBuilder);
        // 4.获取电脑产品
        Computer computer1 = lenovoComputerBuilder.getComputer();
        // 5.输出
        System.out.println(computer1);

        // 购买一台华硕电脑,其cpu为i7,主板为华硕,其余配件不进行选择
        ASUSComputerBuilder asusComputerBuilder = new ASUSComputerBuilder("i7", "华硕");
        computerDirector.buyNoAcesComputer(asusComputerBuilder);
        Computer computer2 = asusComputerBuilder.getComputer();
        System.out.println(computer2);
    }
}

在这里插入图片描述

小结

建造者模式是设计模式中创建型的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式实用范围:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同表示时

tip: 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杀死一只知更鸟debug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值