建造者模式

建造者模式(Builder Pattern)

定义

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

屏蔽建造的具体细节,用户不需要知道对象的建造过程和细节,就可以创建出复杂的对象;

通过先设置好建造者的变量,然后再一次性地创建对象,能够避免无效状态,让对象一直处于有效的状态;

避免冗长的构造函数参数;

设置好所有需要的参数之后进行集中校验,能够避免使用set() 时由于属性志军存在依赖关系而产生的由于 set() 顺序错乱而导致的校验失败的问题。

属于创建型模式。

适用场景

  • 创建对象需要很多步骤,但是步骤的顺序不一定固定。
  • 对象有非常复杂的内部结构(属性较多)
  • 希望把复杂对象的创建和使用分离

标准示例

抽象建造者(Builder):定义了构建复杂对象所需的各个部件的接口,但不涉及具体的部件对象的创建。

java 复制代码
public abstract class Builder {
    protected Product product = new Product();
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract void buildPartC();
    public abstract Product getResult();
}

具体建造者(ConcreteBuilder):实现抽象建造者的接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供一个方法返回创建好的产品对象。

java 复制代码
public class ConcreteBuilder1 extends Builder{
    public void buildPartA() {
        product.setPartA("builder1--A");
    }

    public void buildPartB() {
        product.setPartB("builder1--B");
    }

    public void buildPartC() {
        product.setPartC("builder1--C");
    }

    public Product getResult() {
        return product;
    }
}

指挥者(Director):负责安排复杂对象的建造次序,调用具体建造者来创建复杂对象的各个部分。指挥者不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

java 复制代码
public class Director {
    private Builder builder;
    public Director(Builder builder){
        this.builder = builder;
    }
    public Product construct(){
        builder.buildPartC();
        builder.buildPartB();
        builder.buildPartA();
        return builder.getResult();
    }
}

产品(Product):需要创建的复杂对象,包含多个组成部件。

java 复制代码
@Data
public class Product {
    private String partA;
    private String partB;
    private String partC;

    public void show() {
        System.out.println("Product{" +
                "partA='" + partA + '\'' +
                ", partB='" + partB + '\'' +
                ", partC='" + partC + '\'' +
                '}');
    }
}

ClientTest 测试类:

java 复制代码
public class Client {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder1();
        Director director = new Director(builder);
        Product product = director.construct();
        product.show();

    }
}

输出结果:

java 复制代码
Product{partA='builder1--A', partB='builder1--B', partC='builder1--C'}

我们来举个生活中的例子:

我们想买一台高配置的电脑。

需要选购:CPU、内存、硬盘、显卡、等等。

下面我就通过建造者模式,来模拟这个过程。

涉及到的类有:
ComputerProduct 电脑产品

java 复制代码
@Data
public class ComputerProduct {
    private String cpu;
    private String ram;
    private String hardDisk;
    private String videoCard;

    public String showConfig() {
        return "电脑 " +
                "[" + cpu + ']' +
                "+[" + ram + ']' +
                "+[" + hardDisk + ']' +
                "+[" + videoCard + ']' ;
    }
}

Director 组装指挥者

java 复制代码
public class Director {
    private Builder builder;
    public Director(Builder builder){
        this.builder = builder;
    }
	//独立显卡
    public ComputerProduct construct(){
        builder.buildCpu()
                .buildRam()
                .buildHardDisk()
                .buildVideoCard();
        return builder.getResult();
    }
	//集成显卡
    public ComputerProduct construct2(){
        builder.buildCpu()
                .buildRam()
                .buildHardDisk();
        return builder.getResult();
    }
}

Builder 抽象建造者

java 复制代码
public abstract class Builder {
    protected ComputerProduct computerProduct = new ComputerProduct();

    public abstract Builder buildCpu();
    public abstract Builder buildRam();
    public abstract Builder buildHardDisk();
    public abstract Builder buildVideoCard();
    public abstract ComputerProduct getResult();

}

BuiderUser 具体电脑建造者

java 复制代码
/**
 * 组装人员
 */
public class BuiderUser extends Builder{

    public Builder buildCpu() {
        computerProduct.setCpu("cpu");
        return this;
    }

    public Builder buildRam() {
        computerProduct.setRam("内存");
        return this;
    }

    public Builder buildHardDisk() {
        computerProduct.setHardDisk("硬盘");
        return this;
    }

    public Builder buildVideoCard() {
        computerProduct.setVideoCard("显卡");
        return this;
    }

    public ComputerProduct getResult() {
        return this.computerProduct;
    }
}

ClientTest 测试代码

java 复制代码
public class ClientTest {
    public static void main(String[] args) {
        //装机人员
        Director user = new Director(new BuiderUser());
        ComputerProduct computer = user.construct();
        System.out.println(computer.showConfig());
    }
}

输出结果:

java 复制代码
电脑 [cpu]+[内存]+[硬盘]+[显卡]

以上就是 建造者模式全部内容,感谢阅读。

相关推荐
Niuguangshuo1 分钟前
Python 设计模式:访问者模式
python·设计模式·访问者模式
triticale8 分钟前
【蓝桥杯】P12165 [蓝桥杯 2025 省 C/Java A] 最短距离
java·蓝桥杯
Felven8 分钟前
A. Ideal Generator
java·数据结构·算法
秋野酱16 分钟前
基于 Spring Boot 的银行柜台管理系统设计与实现(源码+文档+部署讲解)
java·spring boot·后端
JAVA学习通30 分钟前
JAVA多线程(8.0)
java·开发语言
不当菜虚困33 分钟前
JAVA设计模式——(七)代理模式
java·设计模式·代理模式
joke_xiaoli42 分钟前
tomcat Server 连接服务器 进展
java·服务器·tomcat
陶然同学1 小时前
RabbitMQ全栈实践手册:从零搭建消息中间件到SpringAMQP高阶玩法
java·分布式·学习·rabbitmq·mq
shanzhizi1 小时前
springboot入门-controller层
java·spring boot·后端
cloues break.1 小时前
C++初阶----模板初阶
java·开发语言·c++