建造者模式简介

概念

建造者模式(Builder Pattern)是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离。它允许您逐步构造一个复杂对象,同时保持灵活性和可读性。

特点

  1. 将对象的构建过程封装在指导者类中,使得客户端不必知道具体的构建细节。
  2. 允许通过改变指导者或具体建造者之一来改变最终生成的产品。
  3. 可以控制生成过程并根据需要进行定制化配置。

优点

  1. 提供了更好的控制和灵活性,可以根据需求定制化地创建复杂对象。
  2. 将构建代码与表示代码分离,使得相同的构建过程可以创建不同表示形式的对象。
  3. 代码可读性高,易于理解和维护。

缺点

  1. 增加了系统中类的数量,在某些情况下可能会增加开发成本。
  2. 如果产品结构非常简单,则使用该模式可能会显得繁琐。

适用场景

  1. 当需要创建具有复杂内部结构且各个部分之间存在依赖关系的对象时,可以使用该模式。
  2. 当希望通过多个步骤动态地自定义一个对象时,可以使用该模式。

实现方式

在指导者类中控制构建过程,导者类负责控制整个构建过程。它接收一个具体的建造者对象,并使用该建造者对象来逐步构建复杂对象。

实现原理

  1. 指导者类持有一个具体的建造者对象。
  2. 在指导者类中定义一系列方法,用于按照特定顺序调用具体建造者对象的方法来构建复杂对象。
  3. 客户端通过创建指导者对象并将具体的建造者传入,然后调用指导者的构建方法来启动整个构建过程。

实现代码 :

java 复制代码
// 产品类
class Product {
    private String part1;
    private String part2;

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public String getPart1(){
        return this.part1;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }

    public String getPart2(){
        return this.part2;
    }
}

// 抽象Builder接口
interface Builder {
    void buildPart1();

    void buildPart2();

    Product getResult();
}

// 具体Builder实现
class ConcreteBuilder implements Builder{
    private Product product;

    public ConcreteBuilder() {
        product = new Product();
    }

    public void buildPart1() {
        product.setPart1("part 1");
    }

    public void buildPart2() {
        product.setPart2("part 2");
    }

    public Product getResult(){
        return product;
    }
}

// 指导者类
class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Product construct() {
        builder.buildPart1();
        builder.buildPart2();
        return builder.getResult();
    }

}
// 使用示例
public class Main {
    public static void main(String[] args) {
        ConcreteBuilder concreteBuilder = new ConcreteBuilder();
        Director director = new Director(concreteBuilder);
        Product product = director.construct();

        System.out.println(product.getPart1());
        System.out.println(product.getPart2());
    }
}

在上述示例中,我们定义了产品类Product作为最终构建的复杂对象。接着,我们定义了抽象的建造者接口Builder,其中包含了构建各个部分的方法和获取最终产品的方法。

具体实现类ConcreteBuilder实现了抽象建造者接口,并提供具体的构建逻辑。指导者类Director持有一个具体的建造者对象,在其构造函数中传入,并通过调用它来控制整个构件过程。

在客户端代码中,我们创建一个具体生成器对象并将其传递给指导者对象。然后调用指导者对象的construct方法启动整个构件过程,并返回最终生成的产品。

存在的问题:

每次增加新类型或结构变化时都需要修改指导着和具体生成器两个角色,这可能会导致代码的脆弱性。

相关推荐
麦兜*1 小时前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
Hellyc6 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen6 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge6 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
百锦再7 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂7 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
有没有没有重复的名字8 小时前
线程安全的单例模式与读者写者问题
java·开发语言·单例模式
程序员的世界你不懂10 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(4)集成Allure报表
java·selenium·maven
isNotNullX10 小时前
数据中台架构解析:湖仓一体的实战设计
java·大数据·数据库·架构·spark