9.建造者模式

文章目录

  • 一、介绍
  • 二、代码
  • 三、实际使用
  • 总结


一、介绍

建造者模式旨在将一个复杂对象的构建过程和其表示分离,以便同样的构建过程可以创建不同的表示。这种模式适用于构建对象的算法(构建过程)应该独立于对象的组成部分以及它们的装配方式的情景。

建造者模式通常包含以下角色:

  1. 产品(Product): 表示被构建的复杂对象。在建造者模式中,产品是由多个部件组成的。

  2. 抽象建造者(Builder): 声明了创建产品各个部件的抽象接口。通常包括创建和装配部件的方法。

  3. 具体建造者(Concrete Builder): 实现抽象建造者接口,负责具体部件的创建和装配。每个具体建造者都定义了自己的方式来构建产品。

  4. 指导者(Director): 负责使用建造者接口来构建产品对象。通常包含一个构建方法,该方法定义了构建产品的顺序。

二、代码

结构图

在这里插入图片描述

代码

/*** 产品类,由多个部件构成*/
public class Product {private List<String> parts = new ArrayList<>();public void add(String part) {parts.add(part);}public void show(){System.out.println("产品部件 --->");for (String part : parts) {System.out.print(part+" ");}}
}
/*** 抽象建造者类,确定产品由两个部件构成,并声明一个得到产品的方法*/
abstract class Builder{public abstract void buildPartA();public abstract void buildPartB();public abstract Product getResult();
}
class Builder1 extends Builder {private Product product = new Product();@Overridepublic void buildPartA() {product.add("部件a");}@Overridepublic void buildPartB() {product.add("部件b");}@Overridepublic Product getResult() {return product;}
}
class Builder2 extends Builder {private Product product = new Product();@Overridepublic void buildPartA() {product.add("部件x");}@Overridepublic void buildPartB() {product.add("部件y");}@Overridepublic Product getResult() {return product;}
}
/*** 指挥者类,用来指挥构建过程*/
class Director {public Product Construct(Builder builder) {builder.buildPartA();builder.buildPartB();return builder.getResult();}
}
public static void main(String[] args) {Director director = new Director();Builder1 builder1 = new Builder1();Builder2 builder2 = new Builder2();Product result1 = director.Construct(builder1);result1.show();Product result2 = director.Construct(builder2);result2.show();
}

三、实际使用

场景

假设我们要创建一个汽车对象,汽车有多个可选的配置,包括引擎类型、车身颜色、轮胎类型等。我们将使用建造者模式来实现汽车对象的配置灵活性。

代码

// 产品类:汽车
class Car {private String engineType;private String bodyColor;private String tireType;// 构造方法私有化,只能通过建造者来构建对象private Car() {}public String getEngineType() {return engineType;}public String getBodyColor() {return bodyColor;}public String getTireType() {return tireType;}// 静态内部类作为具体建造者public static class Builder {private Car car;public Builder() {this.car = new Car();}public Builder setEngineType(String engineType) {car.engineType = engineType;return this;}public Builder setBodyColor(String bodyColor) {car.bodyColor = bodyColor;return this;}public Builder setTireType(String tireType) {car.tireType = tireType;return this;}// 构建汽车对象public Car build() {return car;}}
}// 客户端
public class BuilderPatternFlexibilityExample {public static void main(String[] args) {// 使用建造者模式构建汽车对象,并灵活配置Car car1 = new Car.Builder().setEngineType("V8").setBodyColor("Red").setTireType("Summer").build();Car car2 = new Car.Builder().setEngineType("Hybrid").setBodyColor("Blue").build();// 输出构建好的汽车对象System.out.println("Car 1 - Engine Type: " + car1.getEngineType() +", Body Color: " + car1.getBodyColor() +", Tire Type: " + car1.getTireType());System.out.println("Car 2 - Engine Type: " + car2.getEngineType() +", Body Color: " + car2.getBodyColor() +", Tire Type: " + car2.getTireType());}
}

上面的例子中,Car 是产品类,Car.Builder 是具体建造者。通过具体建造者,我们可以设置汽车的各个可选配置,最后通过 build 方法得到一个完整的汽车对象。客户端可以根据实际需求来选择设置不同的配置,实现了对象配置的灵活性。这种方式可以避免创建多个构造函数以应对各种配置组合的情况,使得代码更加简洁和可维护。

总结

上面的代码中,我们通过不同的具体建造者,同一个指挥者,获得了不一样的产品。在我们平时的情况中,以下的场景可以用到建造者模式

  1. 创建复杂对象: 当一个对象的构建过程比较复杂,涉及多个步骤、部件组合或配置选项时,建造者模式可以将构建过程与最终表示分离,使得代码更清晰、可维护。

  2. 对象的配置灵活性: 当需要创建的对象具有多个配置选项,而客户端希望能够以不同的方式组装对象时,建造者模式可以提供更灵活的配置选择,而无需创建大量的构造函数。

  3. 避免构造器参数过多: 当一个对象的构造函数参数过多,而且可能存在多个可选参数时,使用建造者模式可以避免创建过多的构造函数,使得代码更加清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC SpringMVC 的入门

2.1.环境搭建 2.1.1.创建工程 2.1.2.添加web支持 右键项目选择Add framework support... 如果没有&#xff0c;可以参考idea2023版如何新建web项目 2.添加web支持 ​ 3.效果 ​ 注意&#xff1a; 不要先添加打包方式将web目录要拖拽到main目录下&#xff0c;并改名为…

LeetCode 2707. 字符串中的额外字符

一、题目 1、题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割 s &#xff…

金和OA C6 HomeService.asmx SQL注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和OA C6 HomeService.asmx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞…

个人笔记:分布式大数据技术原理(一)Hadoop 框架

大家想了解更多大数据相关内容请移驾我的课堂&#xff1a; 大数据相关课程 剖析及实践企业级大数据 数据架构规划设计 大厂架构师知识梳理&#xff1a;剖析及实践数据建模 剖析及实践数据资产运营平台 Apache Hadoop 软件库是一个框架&#xff0c;它允许使用简单的编程模型&…

冒泡排序(Java语言)

视屏讲解地址&#xff1a;【手把手带你写十大排序】1.冒泡排序&#xff08;Java语言&#xff09;_哔哩哔哩_bilibili 代码&#xff1a; public class BubbleSort {public void swap(int[] array, int index1, int index2){array[index1] array[index1] ^ array[index2];arra…

【C语言】TCP测速程序

一、服务端 下面是一个用 C 语言编写的测试 TCP 传输速度的基本程序示例。 这只是一个简单示例&#xff0c;没有做详细的错误检查和边缘情况处理。在实际应用中&#xff0c;可能需要增加更多的功能和完善的异常处理机制。 TCP 服务器 (server.c): #include <stdio.h> #…

Rust学习笔记:基础概念介绍(一)

Rust背景 让我们从Rust语言的背景开始&#xff0c;探索它的起源。Rust最初是Mozilla研究院在2006年的一个个人项目。第一个稳定的公开版本发布于2015年5月&#xff0c;但在此之前Mozilla已经在生产软件中使用了Rust。2021年&#xff0c;Rust基金会成立&#xff0c;其宪章是管理…

1.9.。。

1 有道云笔记 2 .cpp #include "mywidget.h" #include "ui_mywidget.h"myWidget::myWidget(QWidget *parent) :QWidget(parent),ui(new Ui::myWidget) {ui->setupUi(this);this->setWindowTitle("原神");this->setStyleSheet("…

35岁程序员,坐标杭州,月薪3W,退休时能领多少钱?

35岁程序员&#xff0c;坐标杭州&#xff0c;月薪3W&#xff0c;退休时能领多少钱&#xff1f; 作为一个35岁的程序员&#xff0c;生活在繁华的杭州这座城市&#xff0c;每个月能够拿到3万元的薪水&#xff0c;是一种相对较高的收入水平。然而&#xff0c;随着时间的推移&…

Gradle有那么多优点 为什么不能取代Maven

Gradle是一款基于Apache Maven的开源构建工具&#xff0c;主要用于Java、Kotlin等编程语言的项目构建。Gradle在许多方面具有优点&#xff0c;但在某些方面也可能无法取代Maven。以下是Gradle的优点和为什么它不能完全取代Maven的原因&#xff1a; Gradle的优点&#xff1a; 更…

jsTicket前端实现微信公众号页面设置禁止分享(比如分享到好友,朋友圈等)

①引入sdk: <script src"https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> ②使用sdk // 微信分享之定义分享按钮功能 export const setWxShareHide () > {request({url: URLS.GET_BAZI_JSTICKET,params: { url: window.location.href…

旋变检测AD2s1205手册学习笔记

旋变故障检测故障表 信号丢失检测 检测原理&#xff1a;任一旋变输入(正弦或余弦)降至指定的LOS正弦/余弦阈值 以下时&#xff0c;器件会检测到信号丢失(LOS)。AD2S1205通过将 监视信号与固定最小值进行比较检测此点 丢失的效果表现&#xff1a;LOS由DOS和LOT引脚均闩锁为逻辑…

索引下推(ICP)的应用条件

如果表访问的类型为range、ref、 eq_ref和ref_or_null可以使用索引下推 ICP可以用于InnoDB和MyISAM表&#xff0c;包括分区表InnoDB和MyISAM 表 对于InnoDB表&#xff0c;ICP 仅用于二级索引。ICP 的目标是减少全行读取次数&#xff0c;从而减少I/O操作。 当SQL使用覆盖索引时&…

最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书

前提&#xff1a;朋友弄了一个培训机构&#xff0c;培训考试合格后&#xff0c;给发证书&#xff0c;需要一个证书查询系统。委托我给弄一个&#xff0c;花了几个晚上给写的证书查询系统。 实现功能&#xff1a; 前端按照姓名手机号码进行证书查询证书信息展示证书展示&#x…

Sentinel-1相关信息(数据类型、成像模式、分辨率......)

【太长不看版】 哨兵-1&#xff08;Sentinel-1&#xff09;提供SAR影像 数据类型&#xff1a; RAW&#xff08;Level-0&#xff09;&#xff1a;原始的SAR数据&#xff0c;未经处理。SLC&#xff08;Level-1&#xff09;&#xff1a;单视复数影像&#xff0c;包含有聚焦的SAR数…

路径规划(二):Dijkstra算法

Dijkstra算法 一、概述二、Dijkstra算法步骤三、相关代码 一、概述 Dijkstra算法是一种用于找到图中最短路径的算法。 二、Dijkstra算法步骤 Dijkstra算法是一种用于求解带权图中单源最短路径的算法。以下是Dijkstra算法的步骤&#xff1a; 初始化&#xff1a;创建两个数组&a…

CTF-PWN-栈溢出-中级ROP-【栈迁移】

文章目录 栈迁移具体流程 VNCTF 2023 traveler libc-2.27检查源码main函数![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/386c35c30f854434ae43667b9473c58a.png)全局变量地址局部变量地址 PIE保护开启PIE关闭PIE 思路exp 栈迁移参考 栈迁移参考 栈迁移 顾名思义…

【技能---pip install 换源加速】

文章目录 概要进行以下的操作其他常用源 概要 有时候安装某个库特别的慢、耗时&#xff01;&#xff01;&#xff01;&#xff01; 例如&#xff1a; pip install opencv-python这个时候会占用大把的时间。。。。。 进行以下的操作 pip install 包名 -i 源地址 例如&#x…

HCIA-Datacom题库(自己整理分类的)_15_VRP平台多选【9道题】

1.VRP操作平台存在哪些命令行视图? 用户视图 接口视图 协议视图 系统视图 2.以下哪些存储介质是华为路由器常用的存储介质 SDRAM NVRAM Flash Hard Disk SD Card 解析&#xff1a;Hard Disk是硬盘&#xff0c;一般网络设备没有。 3.VRP支持通过哪几种方式对路由器…

C#操作注册表

说明 今天用C#开发了一个简单的服务&#xff0c;需要设置成为自启动&#xff0c;网上有很多方法&#xff0c;放到启动运行等&#xff0c;但是今天想介绍一个&#xff0c;通过修改注册表实现&#xff0c;同时介绍一下操作注册表。 private void TestReg(){//仅对当前用户有效 H…