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

23种设计模式之建造者模式

目录

什么是建造者模式

基本结构 

实现步骤 

实现代码(含注释) 

使用场景 


什么是建造者模式

建造者模式(也被成为⽣成器模式),是⼀种创建型设计模式,软件开发过程中有的时候需要创建很复杂的对象,⽽建造者模式的主要思想是将对象的构建过程分为多个步骤,并为每个步骤定义⼀个抽象的接⼝。具体的构建过程 由实现了这些接⼝的具体建造者类来完成。 同时有⼀个指导者类负责协调建造者的⼯作,按照⼀定的顺序或逻辑来执⾏构建步骤,最终⽣成产品。

基本结构 

建造者模式一般由以下几部分组成:

  1. 产品:被构建的复杂对象,包含多个组成部分。
  2. 抽象建造者:定义构建产品各个部分的抽象接口和一个返回产品的方法getResult。
  3. 具体建造者:实现抽象建造者接口,构建产品的各个组成部分,并提供一个方法返回最终产品。
  4. 指导者:调用具体建造者的方法,按照一定的顺序或逻辑来构建产品。

实现步骤 

  1. 定义产品类:产品类应该包含多个组成部分,这些组成部分的属性和方法构成了产品的接口。
  2. 定义抽象建造者接口:创建一个接口,包含构建产品各个部分的抽象方法,这些方法通常用于设置产品的各个属性。
  3. 创建具体建造者:实现抽象建造者接口,构建具体的产品。
  4. 定义指导者类:控制构建产品的顺序和步骤
  5. 客户端使用建造者模式:在客户端中创建(具体建造者对象)和(指导者对象),通过指导者来构建产品。

实现代码(含注释) 

//1. 定义产品类
class Product{
//    产品类包含多个组成部分private String part1;private String part2;public void setPart1(String part1){this.part1=part1;}public void setPart2(String part2){this.part2=part2;}
}
//2.定义抽象建造者接口
interface Builder{void buildPart1(String part1);void buildPart2(String part2);Product getResult();
}
//3.创建具体建造者
class ConcreteBuilder implements Builder{Product product=new Product();@Overridepublic void buildPart1(String part1) {product.setPart1(part1);}@Overridepublic void buildPart2(String part2) {product.setPart2(part2);}@Overridepublic Product getResult() {return product;}
}
//定义指导者类
class Directer{private Builder builder;public Directer(Builder builder){this.builder=builder;}
//    调用方法构建产品public void construct(){builder.buildPart1("part1");builder.buildPart2("part2");}
}
//客户端使用建造者模式:在客户端中创建【具体建造者对象】和【指导者对象】,通过指导者来构建产品。
public class Main {public static void main(String[] args) {//    具体建造者对象Builder builder=new ConcreteBuilder();
//    指导者对象Directer directer=new Directer(builder);
//    指导者构建产品directer.construct();
//        获取构建好的产品Product product=builder.getResult();
//        输出System.out.println(product);}}

使用场景 

使⽤建造者模式有下⾯⼏处优点:
  1. 使⽤建造者模式可以将⼀个复杂对象的构建与其表示分离,通过将构建复杂对象的过程抽象出来,可以使客户 端代码与具体的构建过程解耦。
  2. 同样的构建过程可以创建不同的表示,可以有多个具体的建造者(相互独⽴),可以更加灵活地创建不同组合的对象。
对应的,建造者模式适⽤于复杂对象的创建,当对象构建过程相对复杂时可以考虑使⽤建造者模式,但是当产品的 构建过程发⽣变化时,可能需要同时修改指导类和建造者类,这就使得重构变得相对困难。

相关文章:

  • python基于flask的网上订餐系统769b9-django+vue
  • 蓝桥杯官网填空题(质数拆分)
  • python从入门到精通(十九):python的多线程详细使用
  • Spark编程实验六:Spark机器学习库MLlib编程
  • CI/CD到底是啥?持续集成/持续部署概念解释
  • HTTP网络通信协议基础
  • 【算法训练营】等式,道路升级(c++,python实现)
  • 高斯模糊滤镜
  • AJAX——URL查询参数
  • AI少女/HS2甜心选择2 仿剑三剑灵人物卡全合集打包
  • Unity学习笔记(零基础到就业)|Chapter02:C#基础
  • TCP高频知识点
  • 物联网中基于WIFI的室内温度检测系统设计
  • 【React】如何使antd禁用状态的表单输入组件响应点击事件?
  • C++三剑客之std::optional(一) : 使用详解
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 30秒的PHP代码片段(1)数组 - Array
  • AngularJS指令开发(1)——参数详解
  • ComponentOne 2017 V2版本正式发布
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript设计模式与开发实践系列之策略模式
  • maven工程打包jar以及java jar命令的classpath使用
  • Netty源码解析1-Buffer
  • Promise初体验
  • Python socket服务器端、客户端传送信息
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 服务器从安装到部署全过程(二)
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 一道闭包题引发的思考
  • 一个JAVA程序员成长之路分享
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • Semaphore
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • (js)循环条件满足时终止循环
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (小白学Java)Java简介和基本配置
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • ./configure,make,make install的作用(转)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .sdf和.msp文件读取
  • .so文件(linux系统)
  • @RestController注解的使用
  • [30期] 我的学习方法
  • [Android Studio] 开发Java 程序
  • [C++] Windows中字符串函数的种类
  • [CakePHP] 在Controller中使用Helper
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具
  • [Editor]Unity Editor类常用方法
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件