创建型模式-建造者模式

ops/2024/11/30 18:26:23/

建造者模式(Builder Pattern)是一种创建型设计模式,用于将一个复杂对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。

核心思想

将复杂对象的创建步骤分解开来,通过一步步的构建来完成对象的创建,隐藏构建的具体细节,从而使构造过程更加灵活。

组成

  • Builder(抽象建造者)
    定义用于创建产品各部分的接口。

  • ConcreteBuilder(具体建造者)
    实现抽象建造者接口,完成产品的具体部分构造。

  • Product(产品类)
    表示复杂对象,包含多个组成部分。

  • Director(指挥者)
    调用建造者中的方法按特定顺序来构建产品。

优缺点

  • 优点
    分离复杂构建过程与表示:提高代码的清晰性和可维护性。
    易于扩展:可以通过添加新的具体建造者来扩展创建流程。
    细节控制:通过指挥者可以按特定步骤控制产品的创建顺序。
  • 缺点
    生成器类的数量可能会增加,增加代码复杂度。
    不适用于构造过程过于简单的场景。
    代码实现示例
    假设要创建一辆汽车,每辆车由车轮、发动机、车身等部分组成。
java">// 产品类
public class Car {private String engine;private String wheels;private String body;// Getter 和 Setterpublic void setEngine(String engine) {this.engine = engine;}public void setWheels(String wheels) {this.wheels = wheels;}public void setBody(String body) {this.body = body;}@Overridepublic String toString() {return "Car [engine=" + engine + ", wheels=" + wheels + ", body=" + body + "]";}
}
// 抽象建造者
public interface CarBuilder {void buildEngine();void buildWheels();void buildBody();Car getCar(); // 返回建造好的产品
}
// 具体建造者
public class SportsCarBuilder implements CarBuilder {private Car car;public SportsCarBuilder() {this.car = new Car();}@Overridepublic void buildEngine() {car.setEngine("V8 Engine");}@Overridepublic void buildWheels() {car.setWheels("Sports Wheels");}@Overridepublic void buildBody() {car.setBody("Sleek Sports Body");}@Overridepublic Car getCar() {return car;}
}
// 指挥者
public class Director {private CarBuilder builder;public Director(CarBuilder builder) {this.builder = builder;}public Car constructCar() {builder.buildEngine();builder.buildWheels();builder.buildBody();return builder.getCar();}
}
//客户端测试
public class Main {public static void main(String[] args) {// 创建具体建造者CarBuilder sportsCarBuilder = new SportsCarBuilder();// 指挥者控制构建过程Director director = new Director(sportsCarBuilder);// 构建产品Car sportsCar = director.constructCar();// 输出结果System.out.println(sportsCar);}
}

建造者模式适用场景

  • 复杂对象的创建:当一个对象的创建涉及多个部分且需要特定顺序时。
  • 多种构造方式:需要为同一产品创建不同的表示。
  • 隔离创建细节:需要隐藏产品的构建细节时。
  • 如果你需要进一步探索建造者模式的高级用法或其他设计模式,随时告诉我!

http://www.ppmy.cn/ops/137993.html

相关文章

SQLServer如何导入数据库

环境: 操作系统:win11 数据库:SQL Server2019 数据库文件:先前备份的.bak文件。 前提:一定要切换到超管用户,如默认的sa用户,不然无权访问。 右键单击数据库,点击“还原数据库”。 …

RVO动态避障技术方案介绍

原文:RVO动态避障技术方案介绍 - 哔哩哔哩 我们在开发游戏的时候经常会遇到这样的问题,当我们寻路的时候,其它人也在寻路,如何避免不从其它人的位置穿过。这个叫做动态避障,目前主流的解决方案就是RVO。本节我们来介绍…

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据,这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难,常常导致疏忽。以前,公司依靠 FUD 方法(恐惧、不确定性和怀疑)来识别潜在攻击。然而,将数据科学集成到网络安全中…

postman中获取随机数、唯一ID、时间日期(包括当前日期增减)截取指定位数的字符等

在Postman中,您可以使用内置的动态变量和编写脚本的方式来获取随机数、唯一ID、时间日期以及截取指定位数的字符。以下是具体的操作方法: 一、postman中获取随机数、唯一ID、时间日期(包括当前日期增减)截取指定位数的字符等 获取…

week 6 - SQL Select II

Overview 1. Joins 包括交叉连接(Cross)、内连接(Inner)、自然连接(Natural)、外连接(Outer) 2. ORDER BY to produce ordered output 3. 聚合函数(Aggregate Functio…

33-ESP32-蓝牙篇-00

理解蓝牙技术及其协议栈结构 介绍 在物联网(IoT)领域,蓝牙技术因其低功耗和易用性而成为连接设备的首选无线通信协议之一。ESP32 支持双模蓝牙 4.2,并且已经获得双模蓝牙 4.2 认证和蓝牙 LE 5.0 认证 一、蓝牙技术概述 什么是蓝牙? 蓝牙…

node.js @ffmpeg-installer/ffmpeg 桌面推流

//安装npm install --save ffmpeg-installer/ffmpeg //stream.js // 引入所需模块 const ffmpeg require(ffmpeg-installer/ffmpeg); const { exec } require(child_process); // 设置 FFmpeg 路径 const ffmpegPath ffmpeg.path; const rtmpUrl "rtmp://localhost…

多点DMALL启动招股:将在港交所上市,聚焦数字零售服务

近日,多点数智有限公司(Dmall Inc.,下称“多点”或“多点DMALL”)发布全球发售文件,于11月28日至12月3日招股,预计将于2024年12月6日在港交所主板挂牌上市。 招股书显示,多点DMALL本次全球发售的…