Skip to content

建造者模式

一、介绍

建造者模式(Builder Pattern)旨在将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。该模式通过一个指导者(Director)和多个建造者(Builder)来完成对象的构建。建造者模式适用于创建一些复杂的对象,这些对象由多个部分组成,而且构建过程稳定,但表示可以灵活变化的情况。

二、使用场景

  • 当一个对象的构建过程比较复杂,有多个部分需要逐步构建时。
  • 当需要构建的对象可以有不同的表示时,建造者模式可以灵活地构建不同的表示。
  • 当构建过程稳定,但表示可以变化时,通过不同的建造者类可以构建不同的对象

三、核心组成

  • 产品类(Product): 表示被构建的复杂对象。通常包含多个部分,具有复杂的结构。
  • 抽象建造者接口(Builder): 声明了创建产品各个部分的抽象方法。
  • 具体建造者类(ConcreteBuilder): 实现了抽象建造者接口,负责构建产品的具体部分。通常有一个与产品相关的内部表示。
  • 指导者类(Director): 负责使用建造者接口构建产品。通常包含一个构建方法,该方法按照一定顺序调用建造者的方法,以完成产品的构建。

四、优缺点

优点

  1. 灵活性: 可以通过不同的具体建造者类构建不同的对象表示,实现了构建过程与表示的分离。
  2. 逐步构建: 可以按照一定的顺序逐步构建一个复杂对象,灵活控制构建过程。
  3. 更好的复用性: 可以复用相同的构建过程,通过不同的指导者和建造者组合来构建不同的对象。

缺点

  1. 增加了类和接口: 引入了多个新的类和接口,增加了系统的复杂性。
  2. 对象内部表示可能被暴露: 如果产品类的内部表示对客户端是可见的,可能破坏封
  • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦

  • 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程

  • 增加新的具体建造者无须修改原有类库的代码,符合开闭原则

  • 建造者模式结合链式编程来使用,代码上更加美观

  • 建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用

五、代码

Computer产品对象

package com.lcy.study.design.builder;

import lombok.Data;

/**
 * @Description 建造者模式
 * @Author lcy
 * @Date 2021/7/20 21:49
 */
@Data
public class Computer {

    /**
     * cpu
     */
    private String cpu;

    /**
     * 内存
     */
    private String memory;

    /**
     * 主板
     */
    private String mainBoard;

    /**
     * 硬盘
     */
    private String disk;

    /**
     * 电源
     */
    private String power;

}

抽象建造者ComputerBuilder

package com.lcy.study.design.builder;

/**
 * @Description 建造者的公共方法
 * @Author lcy
 * @Date 2021/7/20 21:53
 */
public interface ComputerBuilder {

    /**
     * 构建Cpu
     * @author lcy
     * @date 2021/7/20 21:54
     **/
    void builderCpu();

    /**
     * 构建内存
     * @author lcy
     * @date 2021/7/20 21:54
     **/
    void builderMemory();

    /**
     * 构建主板
     * @author lcy
     * @date 2021/7/20 21:54
     **/
    void builderMainBoard();

    /**
     * 构建硬盘
     * @author lcy
     * @date 2021/7/20 21:54
     **/
    void builderDisk();

    /**
     * 构建电源
     * @author lcy
     * @date 2021/7/20 21:54
     **/
    void builderPower();

    /**
     * 组合电脑
     * @return com.lcy.study.design.builder.Computer
     * @author lcy
     * @date 2021/7/20 21:55
     **/
    Computer createComputer();

}

具体建造者HighComputerBuilder

package com.lcy.study.design.builder;

/**
 * @Description 高配电脑建造者
 * @Author lcy
 * @Date 2021/7/20 21:56
 */
public class HighComputerBuilder implements ComputerBuilder {

    /**
     * 电脑
     */
    private Computer computer = new Computer();

    @Override public void builderCpu(){
        computer.setCpu("高配 cpu");
    }

    @Override public void builderMemory(){
        computer.setMemory("高配 内存");
    }

    @Override public void builderMainBoard(){
        computer.setMainBoard("高配 主板");
    }

    @Override public void builderDisk(){
        computer.setDisk("高配 硬盘");
    }

    @Override public void builderPower(){
        computer.setPower("高配 电源");
    }

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

组装者Diretor

package com.lcy.study.design.builder;

/**
 * @Description 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程
 * Director是全程指导组装过程,具体的细节还是builder去操作
 * @Author lcy
 * @Date 2021/7/20 22:00
 */
public class Diretor {

    /**
     * 组装电脑
     * @param computerBuilder 电脑建造者
     * @return com.lcy.study.design.builder.Computer
     * @author lcy
     * @date 2021/7/20 22:02
     **/
    public Computer createComputer(ComputerBuilder computerBuilder){
        computerBuilder.builderCpu();
        computerBuilder.builderMemory();
        computerBuilder.builderMainBoard();
        computerBuilder.builderDisk();
        computerBuilder.builderPower();
        return computerBuilder.createComputer();
    }

}