Java建造者模式详解

前言

在生活中,有这么一种场景,当需要去4S店买车时,会根据个人的预算,卖家会给你推荐同一个品牌的相应的低配,中配或高配版,在网上购买毕笔记本时也会遇到类似的情况,但不管是汽车也好,还是电脑,它们基本的功能都是具备的,但是内部使用的材料不同造成最终搭配出来的效果不一样,映射到设计模式上,就是一个典型的建造者设计模式

建造者设计模式

  • 使用多个简单的对象一步步构建成一个复杂的对象,即将一个复杂对象的构建与表示进行分离,使得同样的构建过程存在多种表示(即电脑可以有多条组装线,A线组装低配电脑,B线组装高配电脑)
  • 允许用户只需要指定复杂对象的类型和内容就可以构建它们,不需要知道构建内容的具体细节(比如上述以购买笔记本电脑为例,用户只需选择自己的配置类型是低或中或高配类型即可)

建造者模式核心组成结构

  • Builder:抽象建造者,统一定义多个通用方法和构建产品的方法
  • ConcreteBuilder:具体建造者,可以有多个
  • Director:总指挥,控制整个产品的组装过程,将需求交给建造者,由建造者创建对象
  • Product:产品角色

下面用一张简单的图表示该模式下各个角色的位置

在这里插入图片描述

代码演示

本文以组装笔记本电脑为例说明

1、具体的产品,Computer

@Data
@Setter
@Getter
@ToString
public class Computer {

    private String cpu;
    private String memory;
    private String mainboard;
    private String disk;
    private String power;

}

2、Builder,定义构建产品的通用方法

public interface Builder {

    void buildCpu();

    void buildMainBoard();

    void buildDisk();

    void buildPower();

    void buildMemory();

    Computer createComputer();
}

3、具体的产品构建者,创建两个类,分别创建低配版电脑和高配版电脑

低配版电脑

public class LowLevelBuilder implements Builder{

private Computer computer = new Computer();

@Override
public void buildCpu() {
    computer.setCpu("低配版 CPU");
}

@Override
public void buildMainBoard() {
    computer.setMainboard("低配版 主板");
}

@Override
public void buildDisk() {
    computer.setDisk("低配版 硬盘");
}

@Override
public void buildPower() {
    computer.setPower("低配版 电源");
}

@Override
public void buildMemory() {
    computer.setMemory("低配版 内存");
}

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

}

高配版电脑

public class HighLevelBuilder implements Builder{

    private Computer computer = new Computer();

    @Override
    public void buildCpu() {
        computer.setCpu("高配版 CPU");
    }

    @Override
    public void buildMainBoard() {
        computer.setMainboard("高配版 主板");
    }

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

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

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

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

}

4、总指挥,负责根据用户需求,创建指定类型(低配或高配)的电脑

public class ComputerDirector {

    public Computer createComputer(Builder builder){
        builder.buildCpu();
        builder.buildMainBoard();
        builder.buildDisk();
        builder.buildPower();
        builder.buildMemory();
        return builder.createComputer();
    }
}

说明:

总指挥的角色,可以将产品和创建的过程进行解耦,使用相同的创建过程就可以创建不同的产品,控制产品的生产过程,即只负责组装,相当于是简单调用接口中的组装方法,具体的实现细节由各个builder去操作

测试:

public class Test {

    public static void main(String[] args) {
        ComputerDirector director = new ComputerDirector();
        Computer computer1 = director.createComputer(new HighLevelBuilder());
        System.out.println(computer1.toString());

        System.out.println();

        Computer computer2 = director.createComputer(new LowLevelBuilder());
        System.out.println(computer2.toString());
    }
}

在这里插入图片描述

通过这种方式就可以达到根据需求产生同一类产品不同规格的需求

建造者设计模式优点:

  • 客户端不必知道产品内部的组成细节,从而将产品的本身与产品的创建过程进行分离
  • 逻辑结构比较清晰简单,开发者的学习和理解都较为容易
  • 每个具体的创建者都相对独立,之间互不影响,从而方便各个建造者更好的关注自己的产品创建过程
  • 新增的具体建造者无需修改原有的代码,符合开闭原则
  • 建造者设计模式如果结合链式编程来使用,可以使代码更优雅

缺点:

  • 使用建造者模式创建的产品一般来说具有较多的共同的特点,如果产品的差异较大使用起来并不是很好
  • 每新增一种规则的产品,需要添加新的建造者,一定程度上会让代码越来越臃肿

猜你喜欢

转载自blog.csdn.net/zhangcongyi420/article/details/113831724