当前位置: 首页 > news >正文

二十三种设计模式-建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种分步骤构建复杂对象的方法。这种模式允许你通过相同的创建过程构建不同的表示。建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的对象。

建造者模式的主要角色

  1. 产品(Product):需要被构建的复杂对象。
  2. 抽象建造者(Builder):一个接口或抽象类,它规定了建造产品的必要步骤。
  3. 具体建造者(Concrete Builder):实现抽象建造者接口,完成产品构建的具体步骤,并提供一个方法返回构建好的产品。
  4. 指挥者(Director):包含客户端代码,负责按照某种顺序调用建造者接口的方法,以指导构建过程。
  5. 客户端(Client):创建具体的建造者对象,然后通过指挥者对象指定的构建步骤来构建复杂对象。

建造者模式的实现步骤

  1. 定义产品类:创建一个包含多个属性和相应setter方法的产品类。
  2. 定义抽象建造者:创建一个包含建造复杂对象步骤的接口或抽象类。
  3. 实现具体建造者:实现抽象建造者接口,定义具体产品的类型。
  4. 实现指挥者:创建一个指挥者类,它接受一个建造者对象,并包含构建复杂对象的方法。
  5. 客户端代码:使用具体建造者对象和指挥者对象来构建产品。

建造者模式的代码示例

// 产品类
class Product {private String partA;private String partB;private String partC;// 省略getter和setter方法
}// 抽象建造者
interface Builder {void buildPartA();void buildPartB();void buildPartC();Product getResult();
}// 具体建造者
class ConcreteBuilder implements Builder {private Product product = new Product();public void buildPartA() {product.setPartA("PartA");}public void buildPartB() {product.setPartB("PartB");}public void buildPartC() {product.setPartC("PartC");}public Product getResult() {return product;}
}// 指挥者
class Director {public void construct(Builder builder) {builder.buildPartA();builder.buildPartB();builder.buildPartC();}
}// 客户端代码
public class BuilderPatternDemo {public static void main(String[] args) {Builder builder = new ConcreteBuilder();Director director = new Director();director.construct(builder);Product product = builder.getResult();// 使用product对象}
}

建造者模式的优点

  1. 封装性:建造者模式将产品构建过程封装在建造者类中,使得客户端不需要知道产品内部的构建细节。
  2. 灵活性:客户端可以只通过指挥者类来指导产品的构建,而不需要关心具体的建造逻辑。
  3. 扩展性:新增具体建造者类不会影响其他类,易于扩展新的建造过程。
  4. 解耦:客户端和产品构建逻辑解耦,提高了代码的可维护性。

建造者模式的缺点

  1. 类的个数增多:每增加一个产品,可能需要增加新的建造者类和产品类,导致系统更加复杂。
  2. 对象创建变得复杂:对于简单的对象,使用建造者模式可能会使对象创建过程变得过于复杂。

建造者模式特别适用于创建复杂对象,其中对象的创建过程需要多个步骤,或者对象的创建过程需要灵活多变。这种模式在需要精细控制对象构建过程的场景中非常有用,例如在复杂的XML文档构建、数据库查询构建等场景中。

http://www.lryc.cn/news/514292.html

相关文章:

  • MarkDown 的 mermaid gantt(甘特图)、mermaid sequenceDiagram (流程图) 语法解析和应用
  • git submodule的使用:将别人的git仓库作为自己的子仓库
  • Springboot 下载附件
  • MySQL 延迟复制:确保数据安全与系统稳定的秘诀
  • ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana
  • python实现自动登录12306抢票 -- selenium
  • 使用Diffusion Models进行图像超分辩重建
  • 吾杯网络安全技能大赛——Misc方向WP
  • Web安全 - “Referrer Policy“ Security 头值不安全
  • C#OPC(上)
  • Imgui + Cmake + OpenGL + GLFW 隐藏控制台窗口
  • Spring Boot(七):Swagger 接口文档
  • RabbitMQ - 4 ( 22000 字 RabbitMQ 入门级教程 )
  • 印象笔记07——试一试PDF标注
  • Vue3实战教程》24:Vue3自定义指令
  • 【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向
  • 【ArcGIS Pro/GeoScene Pro】可视化时态数据
  • Linux buildroot和ubuntu的异同点
  • k8s系列--通过docker拉取的镜像导入到 containerd中
  • Spring Boot(快速上手)
  • note 41:账务系统开发规范
  • 基于嵌入式无人机UAV通信系统的实时最优资源分配算法matlab仿真
  • 《Vue3实战教程》35:Vue3测试
  • 【Java设计模式-3】门面模式——简化复杂系统的魔法
  • log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件
  • super_vlan
  • 前端CSS3学习
  • HTML——58.value和placeholder
  • STM32单片机芯片与内部57 SPI 数据手册 寄存器
  • 前端异常处理合集