详细讨论建造者模式的概念、结构、应用场景和实现方法

简介: 【2月更文挑战第12天】

设计模式在软件开发中起着重要的作用,它们提供了一种经过验证的解决方案,以解决常见的设计问题。建造者模式是一种创建型设计模式,旨在将复杂的对象构建过程与其表示分离,从而使构建过程更加灵活和可扩展。本文将详细讨论建造者模式的概念、结构、应用场景和实现方法。

概述

建造者模式属于创建型设计模式,它通过将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它通过提供一个抽象的Builder接口和一个具体的Builder实现类,使得构建过程能够逐步执行,并最终构造出一个复杂的对象。

结构

建造者模式包含以下几个关键组成部分:

  • Builder(构建者):定义了构建对象的抽象接口,包括设置属性和构建对象的方法。
  • ConcreteBuilder(具体构建者):实现Builder接口,负责实际构建对象的过程。
  • Product(产品):表示被构建的复杂对象,它包含了各个部分的组成。
  • Director(指挥者):负责安排Builder的构建顺序和过程。

以下是建造者模式的结构示意图:

  -------------          ----------
  |  Director  |          | Builder |
  -------------          ----------
      |                        |
      |        -------------
      --->    |  Product  |
                -------------

适用场景

建造者模式适用于以下场景:

  • 当对象构建过程需要进行复杂的算法或步骤,并且这些步骤可以在不同的场景下生成不同的表示时。
  • 当需要创建一个对象的不同表示,但是构建步骤相同或相似。

实现方法

在实现建造者模式时,我们需要按照以下步骤进行操作:

  1. 定义Product类,表示被构建的复杂对象。
  2. 定义Builder接口,包含构建对象步骤和设置属性的方法。
  3. 创建具体Builder类,实现Builder接口,并实现构建对象的具体步骤。
  4. 创建Director类,负责协调构建过程,并控制builder的顺序。
  5. 在Client中使用Director构建对象。

以下是一个简单的建造者模式实现示例:

// Product类
public class Car {
   
    private String brand;
    private String color;

    // Setter方法

    // ...
}
// Builder接口
public interface CarBuilder {
   
    void setBrand(String brand);
    void setColor(String color);

    Car getCar();
}
// 具体Builder类
public class SportsCarBuilder implements CarBuilder {
   
    private Car car;

    public SportsCarBuilder() {
   
        this.car = new Car();
    }

    @Override
    public void setBrand(String brand) {
   
        car.setBrand(brand);
    }

    @Override
    public void setColor(String color) {
   
        car.setColor(color);
    }

    @Override
    public Car getCar() {
   
        return car;
    }
}
// Director类
public class CarDirector {
   
    private CarBuilder builder;

    public CarDirector(CarBuilder builder) {
   
        this.builder = builder;
    }

    public void constructCar() {
   
        builder.setBrand("Sports Car");
        builder.setColor("Red");
    }
}
// Client类
public class Client {
   
    public static void main(String[] args) {
   
        // 创建Builder对象
        CarBuilder builder = new SportsCarBuilder();

        // 创建Director对象
        CarDirector director = new CarDirector(builder);

        // 构建对象
        director.constructCar();

        // 获取结果
        Car car = builder.getCar();

        // 使用构建好的对象
        System.out.println(car.getBrand());
        System.out.println(car.getColor());
    }
}

优点

  • 将复杂对象的构建过程与其表示分离,使得构建过程更具灵活性和可扩展性。
  • 可以通过改变具体的Builder或Director来创建不同的表示。

缺点

  • 增加了代码的复杂性,需要额外创建Builder类和Director类。

总结

建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离。通过提供一个抽象的Builder接口和一个具体的Builder实现类,它使得构建过程逐步执行,并最终构造出一个复杂的对象。建造者模式适用于构建过程需要逐步执行或构建的对象有多个表示的场景。希望本文能够帮助读者更好地理解和应用建造者模式。

目录
相关文章
|
存储 缓存 分布式计算
阿里云服务器2核16G、4核32G、8核64G配置最新收费标准及活动价格参考(2024更新)
2核16G、8核64G、4核32G配置的云服务器处理器与内存比为1:8,这种配比的云服务器一般适用于数据分析与挖掘,Hadoop、Spark集群和数据库,缓存等内存密集型场景,因此,多为企业级用户选择,目前用户购买2核16G配置活动价格最低为1473.41元/1年起,购买4核32G配置活动价格最低为2896.42元/1年起,购买8核64G配置活动价格最低为5742.43元/1年起,本文介绍这些配置的最新购买价格,包含原价收费标准和最新活动价格。
阿里云服务器2核16G、4核32G、8核64G配置最新收费标准及活动价格参考(2024更新)
|
jenkins 测试技术 持续交付
Jenkins从节点上构建自动化测试项目时报错:java.io.IOException: Unexpected termination of the channel
在mac电脑上配置了Jenkins从节点,在该从节点上构建app UI 自动化测试项目,运行一些用例后报如下错误:
|
存储 消息中间件 监控
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统ELK、日志收集分析
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统、日志收集分析。日志级别从小到大的关系(优先级从低到高): ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 低级别的会输出高级别的信息,高级别的不会输出低级别的信息
|
人工智能 Java API
Spring AI 抢先体验,5 分钟玩转 Java AI 应用开发
Spring Cloud Alibaba AI 以 Spring AI 为基础,并在此基础上提供阿里云通义系列大模型全面适配,让用户在 5 分钟内开发基于通义大模型的 Java AI 应用。
227268 125
|
7月前
|
人工智能 JavaScript 前端开发
一个支持阿里云百炼平台DeepSeek R1大模型(智能体)的Wordpress插件,AI Agent or Chatbot.
这是一个将阿里云DeepSeek AI服务集成到WordPress的聊天机器人插件,支持多轮对话、上下文记忆和自定义界面等功能。用户可通过短代码轻松添加到页面,并支持多种配置选项以满足不同需求。项目采用MIT协议授权,代码仓位于GitHub与Gitee。开发者Chi Leung为长期境外工作,代码注释以英文为主。适合需要在WordPress网站中快速部署AI助手的用户使用。
|
12月前
|
消息中间件 存储 Java
Kafka 如何避免重复消费?
在Apache Kafka中,避免消息的重复消费是确保数据准确处理的关键。本文详细介绍了七种避免重复消费的方法:使用消费者组、幂等生产者、事务性生产者与消费者、手动提交偏移量、外部存储管理偏移量、去重逻辑及幂等消息处理逻辑。每种方法均有其优缺点,可根据实际需求选择合适方案。结合消费者组、手动提交偏移量和幂等处理逻辑通常是有效策略,而对于高一致性要求,则可考虑使用事务性消息。
1750 0
|
存储 缓存 文件存储
NAS怎么用?
【6月更文挑战第30天】NAS怎么用?
1020 58
|
SQL druid Java
解决 ‘The last packet successfully received from the server was xxx milliseconds ago‘ 问题
解决 ‘The last packet successfully received from the server was xxx milliseconds ago‘ 问题
6472 0
|
Oracle 关系型数据库 数据库
Win11系统如何安装Oracle数据库(超级详细)
Win11系统如何安装Oracle数据库(超级详细)
1257 0
|
人工智能 数据安全/隐私保护 开发者
AIGC带来的伦理之思
【1月更文挑战第13天】AIGC带来的伦理之思
781 4
AIGC带来的伦理之思