设计模式--建造者模式 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个,而且这些参数有些是可选的参数,考虑使用构造者模式。


相关文章
|
6天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
3月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
48 0
|
5月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
5月前
|
设计模式 算法 索引
程序技术好文:设计模式之美:Builder(生成器)
程序技术好文:设计模式之美:Builder(生成器)
|
5月前
|
设计模式 Java
Java设计模式:建造者模式之经典与流式的三种实现(四)
Java设计模式:建造者模式之经典与流式的三种实现(四)
|
5月前
|
设计模式 Java
Java设计模式之建造者模式详解
Java设计模式之建造者模式详解
|
5月前
|
设计模式 Java
设计模式之建造者模式
设计模式之建造者模式
|
15天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式