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

简谈设计模式之建造者模式

建造者模式是一种创建型设计模式, 旨在将复杂对象的构建过程与其表示分离, 使同样的构建过程可以构建不同的表示. 建造者模式主要用于以下情况:

  1. 需要创建的对象非常复杂: 这个对象由多个部分组成, 且这些部分需要一步步地构建
  2. 不同的表示: 通过相同的构建过程可以生成不同的表示
  3. 构建过程的控制: 希望能够有更多的控制, 逐步创建对象, 而不是在一个步骤中完成

建造者模式结构

  1. 抽象建造者: 定义了创建产品的各部件的抽象接口
  2. 具体建造者: 实现了建造者接口, 构建并装配各个部件, 最终生成具体的产品
  3. 产品: 具体要创建的复杂对象
  4. 指挥者: 负责安排已有模块的顺序构建一个复杂的对象

建造者模式实现

// 产品类
public class Product {private String partA;private String partB;private String partC;public void setPartA(String partA) {this.partA = partA;}public void setPartB(String partB) {this.partB = partB;}public void setPartC(String partC) {this.partC = partC;}@Overridepublic String toString() {return "Product [partA=" + partA + ", partB=" + partB + ",partC=" + partC + "]";}
}// 抽象建造者
public abstract class Builder {protected Product product = new Product();public abstract void buildPartA();public abstract void buildPartB();public abstract void buildPartC();public Product getResult() {return product;}
}// 具体建造者
public class ConcreteBuilder extends Builder {@Overridepublic void buildPartA() {product.setPartA("Part A");}@Overridepublic void buildPartB() {product.setPartA("Part B");}@Overridepublic void buildPartC() {product.setPartA("Part C");}
}// 指挥者
public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder}public void construct() {builder.buildPartA();builder.buildPartB();builder.buildPartC();}
}

优点:

  • 易于拓展: 通过创建新的具体建造者, 可以很容易地增加新的产品表示
  • 细粒度控制: 可以一步步地构建对象, 细化对象的创建流程
  • 封装性: 将复杂对象的创建封装在建造者中, 客户端无需了解细节

缺点:

  • 更多的代码量: 为了实现建造者模式, 需要更多的类和接口, 增加了代码量
  • 复杂性: 对于简单的对象创建, 建造者模式过于复杂了

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 蓝牙BLE广播
  • 深入了解 MySQL 的 EXPLAIN 命令
  • Spring Boot中的安全配置与实现
  • 如何指定多块GPU卡进行训练-数据并行
  • UOS统信系统开机启动故障
  • Linux系统密码重置
  • [综述笔记]Functional neuroimaging as a catalyst for integrated neuroscience
  • ES13的4个改革性新特性
  • vue3中antd上传图片组件及回显
  • Android OkHttp3中HttpLoggingInterceptor使用
  • CV10_模型、特征图、CAM热力图可视化
  • 玩转springboot之SpringApplicationRunListener
  • 能够支持百度独立导航的智能手表你见过吗?
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(一)-3GPP TR 22.829 V17.1.0技术报告
  • Rust编程-I/O
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • express.js的介绍及使用
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaScript的使用你知道几种?(上)
  • JSONP原理
  • opencv python Meanshift 和 Camshift
  • springMvc学习笔记(2)
  • Vue小说阅读器(仿追书神器)
  • 关于字符编码你应该知道的事情
  • 前端面试题总结
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • #{} 和 ${}区别
  • #在 README.md 中生成项目目录结构
  • (02)Unity使用在线AI大模型(调用Python)
  • (1) caustics\
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (6)STL算法之转换
  • (7)svelte 教程: Props(属性)
  • (a /b)*c的值
  • (zt)最盛行的警世狂言(爆笑)
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三)uboot源码分析
  • (四)js前端开发中设计模式之工厂方法模式
  • (四)stm32之通信协议
  • (转)http-server应用
  • (转)IOS中获取各种文件的目录路径的方法
  • .gitattributes 文件
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net Remoting常用部署结构
  • .net 设置默认首页
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET单元测试
  • .NET周刊【7月第4期 2024-07-28】
  • /usr/bin/env: node: No such file or directory
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • @PostConstruct 注解的方法用于资源的初始化