设计模式——建造者模式

217 阅读3分钟

《Head First 设计模式》《设计模式之禅(第二版)》 学习笔记,码云同步更新中

如有错误或不足之处,请一定指出,谢谢~

目录

设计原则
设计模式

建造者模式(Builder Pattern)

定义

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

结构
  • Product产品类:通常是实现了模板方法模式。
  • Builder抽象建造者:规范产品的组建,一般是由子类实现。
  • ConcreteBuilder具体建造者:实现抽象类定义的所有方法,并且返回一个组建好的对象。
  • Director导演类:负责安排已有模块的顺序,然后告诉Builder开始建造
优点
  • 封装性:使用建造者模式可以使客户端不必知道产品内部组成的细节。
  • 建造者独立,容易扩展
  • 便于控制细节风险:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
使用场景
  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
与工厂模式的区别

工厂方法的侧重点是创建,不关心组装顺序。而建造者模式主要是基本方法的调用顺序安排,是零件的装配。

示例

一台电脑主机由内存、cpu、显卡等部件组成。我想组装一台16G内存,i7处理器,1T硬盘的电脑,只需要告诉老板这些信息,老板安排小弟去组装,然后一手交钱一手拿货就好,完全不需要关心到底是怎么装起来的。 现在来模拟这个过程(参考了GsonBuilder的代码)

首先是电脑:

@Data
public class Computer {

    public Computer(String mainBoard, String hardDisk, String memory, String cpu) {
        this.mainBoard = mainBoard;
        this.hardDisk = hardDisk;
        this.memory = memory;
        this.cpu = cpu;
    }

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

    /**
     * 硬盘
     */
    private String hardDisk;

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

    /**
     * cpu
     */
    private String cpu;
}

然后是组装电脑类ComputerBuilder

public class ComputerBuilder {

    private String mainBoard = "默认主板";
    private String hardDisk = "默认硬盘";
    private String memory = "默认内存";
    private String cpu = "默认cpu";

    public ComputerBuilder installMainBoard(String mainBoard) {
        this.mainBoard = mainBoard;
        return this;
    }

    public ComputerBuilder installHardDisk(String hardDisk) {
        this.hardDisk = hardDisk;
        return this;
    }

    public ComputerBuilder installMemory(String memory) {
        this.memory = memory;
        return this;
    }

    public ComputerBuilder installCpu(String cpu) {
        this.cpu = cpu;
        return this;
    }

    public Computer create() {
        return new Computer(mainBoard, hardDisk, memory, cpu);
    }
}

然后来测试一下

public class Test {
    public static void main(String[] args) {

        // 没有定制需求,组装一台默认配置电脑
        Computer computer1 = new ComputerBuilder().create();

        System.out.println(computer1);

        // 组装一台定制配置的电脑
        Computer computer2 = new ComputerBuilder()
                .installMainBoard("xxx主板")
                .installCpu("intel 酷睿i7 xxx")
                .installHardDisk("xxx牌 1T")
                .installMemory("xxx 16G")
                .create();

        System.out.println(computer2);
    }
}