设计模式——建造者模式(Java示例)
引言
生成器是一种创建型设计模式, 使你能够分步骤创建复杂对象。
与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的产品成为可能。
复杂度: 中等
流行度: 流行
使用示例: 生成器模式是 Java 世界中的一个著名模式。 当你需要创建一个可能有许多配置选项的对象时, 该模式会特别有用。
生成器在 Java 核心程序库中得到了广泛的应用:
- java.lang.StringBuilder#append() (
非同步) - java.lang.StringBuffer#append() (
同步) - java.nio.ByteBuffer#put() (还有 CharBuffer、 ShortBuffer、 IntBuffer、 LongBuffer、 FloatBuffer 和 DoubleBuffer)
- javax.swing.GroupLayout.Group#addComponent()
- java.lang.Appendable的所有实现
识别方法: 生成器模式可以通过类来识别, 它拥有一个构建方法和多个配置结果对象的方法。 生成器方法通常支持方法链 (例如 someBuilder.setValueA(1).setValueB(2).create())。
分步制造汽车
在本例中, 生成器模式允许你分步骤地制造不同型号的汽车。
示例还展示了生成器如何使用相同的生产过程制造不同类型的产品 (汽车手册)。
主管控制着构造顺序。 它知道制造各种汽车型号需要调用的生产步骤。 它仅与汽车的通用接口进行交互。 这样就能将不同类型的生成器传递给主管了。
最终结果将从生成器对象中获得, 因为主管不知道最终产品的类型。 只有生成器对象知道自己生成的产品是什么。
builders
builders/Builder.java: 通用生成器接口
package refactoring_guru.builder.example.builders;import refactoring_guru.builder.example.cars.CarType;
import refactoring_guru.builder.example.components.Engine;
import refactoring_guru.builder.example.components.GPSNavigator;
import refactoring_guru.builder.example.components.Transmission;
import refactoring_guru.builder.example.components.TripComputer;/*** Builder interface defines all possible ways to configure a product.*/
public interface Builder {void setCarType(CarType type);void setSeats(int seats);void setEngine(Engine engine);void setTransmission(Transmission transmission);void setTripComputer(TripComputer tripComputer);void setGPSNavigator(GPSNavigator gpsNavigator);
}
builders/CarBuilder.java: 汽车生成器
/*** Concrete builders implement steps defined in the common interface.*/
public class CarBuilder implements Builder {private CarType type;private int seats;private Engine engine;private Transmission transmission;private TripComputer tripComputer;private GPSNavigator gpsNavigator;public void setCarType(CarType type) {this.type = type;}@Overridepublic void setSeats(int seats) {this.seats = seats;}@Overridepublic void setEngine(Engine engine) {this.engine = engine;}@Overridepublic void setTransmission(Transmission transmission) {this.transmission = transmission;}@Overridepublic void setTripComputer(TripComputer tripComputer) {this.tripComputer = tripComputer;}@Overridepublic void setGPSNavigator(GPSNavigator gpsNavigator) {this.gpsNavigator = gpsNavigator;}public Car getResult() {return new Car(type, seats, engine, transmission, tripComputer, gpsNavigator);}
}
builders/CarManualBuilder.java: 汽车手册生成器
/*** Unlike other creational patterns, Builder can construct unrelated products,* which don't have the common interface.** In this case we build a user manual for a car, using the same steps as we* built a car. This allows to produce manuals for specific car models,* configured with different features.*/
public class CarManualBuilder implements Builder{private CarType type;private int seats;private Engine engine;private Transmission transmission;private TripComputer tripComputer;private GPSNavigator gpsNavigator;@Overridepublic void setCarType(CarType type) {this.type = type;}@Overridepublic void setSeats(int seats) {this.seats = seats;}@Overridepublic void setEngine(Engine engine) {this.engine = engine;}@Overridepublic void setTransmission(Transmission transmission) {this.transmission = transmission;}@Overridepublic void setTripComputer(TripComputer tripComputer) {this.tripComputer = tripComputer;}@Overridepublic void setGPSNavigator(GPSNavigator gpsNavigator) {this.gpsNavigator = gpsNavigator;}public Manual getResult() {return new Manual(type, seats, engine, transmission, tripComputer, gpsNavigator);}
}
cars
cars/Car.java: 汽车产品
/*** Car is a product class.*/
public class Car {private final CarType carType;private final int seats;private final Engine engine;private final Transmission transmission;private final TripComputer tripComputer;private final GPSNavigator gpsNavigator;private double fuel = 0;public Car(CarType carType, int seats, Engine engine, Transmission transmission,TripComputer tripComputer, GPSNavigator gpsNavigator) {this.carType = carType;this.seats = seats;this.engine = engine;this.transmission = transmission;this.tripComputer = tripComputer;if (this.tripComputer != null) {this.tripComputer.setCar(this);}this.gpsNavigator = gpsNavigator;}public CarType getCarType() {return carType;}public double getFuel() {return fuel;}public void setFuel(double fuel) {this.fuel = fuel;}public int getSeats() {return seats;}public Engine getEngine() {return engine;}public Transmission getTransmission() {return transmission;}public TripComputer getTripComputer() {return tripComputer;}public GPSNavigator getGpsNavigator() {return gpsNavigator;}
}
cars/Manual.java: 手册产品
/*** Car manual is another product. Note that it does not have the same ancestor* as a Car. They are not related.*/
public class Manual {private final CarType carType;private final int seats;private final Engine engine;private final Transmission transmission;private final TripComputer tripComputer;private final GPSNavigator gpsNavigator;public Manual(CarType carType, int seats, Engine engine, Transmission transmission,TripComputer tripComputer, GPSNavigator gpsNavigator) {this.carType = carType;this.seats = seats;this.engine = engine;this.transmission = transmission;this.tripComputer = tripComputer;this.gpsNavigator = gpsNavigator;}public String print() {String info = "";info += "Type of car: " + carType + "\n";info += "Count of seats: " + seats + "\n";info += "Engine: volume - " + engine.getVolume() + "; mileage - " + engine.getMileage() + "\n";info += "Transmission: " + transmission + "\n";if (this.tripComputer != null) {info += "Trip Computer: Functional" + "\n";} else {info += "Trip Computer: N/A" + "\n";}if (this.gpsNavigator != null) {info += "GPS Navigator: Functional" + "\n";} else {info += "GPS Navigator: N/A" + "\n";}return info;}
}
cars/CarType.java
package refactoring_guru.builder.example.cars;public enum CarType {CITY_CAR, SPORTS_CAR, SUV
}
components
components/Engine.java: 产品特征 1
/*** Just another feature of a car.*/
public class Engine {private final double volume;private double mileage;private boolean started;public Engine(double volume, double mileage) {this.volume = volume;this.mileage = mileage;}public void on() {started = true;}public void off() {started = false;}public boolean isStarted() {return started;}public void go(double mileage) {if (started) {this.mileage += mileage;} else {System.err.println("Cannot go(), you must start engine first!");}}public double getVolume() {return volume;}public double getMileage() {return mileage;}
}
components/GPSNavigator.java: 产品特征 2
/*** Just another feature of a car.*/
public class GPSNavigator {private String route;public GPSNavigator() {this.route = "221b, Baker Street, London to Scotland Yard, 8-10 Broadway, London";}public GPSNavigator(String manualRoute) {this.route = manualRoute;}public String getRoute() {return route;}
}
components/Transmission.java: 产品特征 3
/*** Just another feature of a car.*/
public enum Transmission {SINGLE_SPEED, MANUAL, AUTOMATIC, SEMI_AUTOMATIC
}
components/TripComputer.java: 产品特征 4
/*** Just another feature of a car.*/
public class TripComputer {private Car car;public void setCar(Car car) {this.car = car;}public void showFuelLevel() {System.out.println("Fuel level: " + car.getFuel());}public void showStatus() {if (this.car.getEngine().isStarted()) {System.out.println("Car is started");} else {System.out.println("Car isn't started");}}
}
director
director/Director.java: 主管控制生成器
/*** Director defines the order of building steps. It works with a builder object* through common Builder interface. Therefore it may not know what product is* being built.*/
public class Director {public void constructSportsCar(Builder builder) {builder.setCarType(CarType.SPORTS_CAR);builder.setSeats(2);builder.setEngine(new Engine(3.0, 0));builder.setTransmission(Transmission.SEMI_AUTOMATIC);builder.setTripComputer(new TripComputer());builder.setGPSNavigator(new GPSNavigator());}public void constructCityCar(Builder builder) {builder.setCarType(CarType.CITY_CAR);builder.setSeats(2);builder.setEngine(new Engine(1.2, 0));builder.setTransmission(Transmission.AUTOMATIC);builder.setTripComputer(new TripComputer());builder.setGPSNavigator(new GPSNavigator());}public void constructSUV(Builder builder) {builder.setCarType(CarType.SUV);builder.setSeats(4);builder.setEngine(new Engine(2.5, 0));builder.setTransmission(Transmission.MANUAL);builder.setGPSNavigator(new GPSNavigator());}
}
Demo.java: 客户端代码
/*** Demo class. Everything comes together here.*/
public class Demo {public static void main(String[] args) {Director director = new Director();// Director gets the concrete builder object from the client// (application code). That's because application knows better which// builder to use to get a specific product.CarBuilder builder = new CarBuilder();director.constructSportsCar(builder);// The final product is often retrieved from a builder object, since// Director is not aware and not dependent on concrete builders and// products.Car car = builder.getResult();System.out.println("Car built:\n" + car.getCarType());CarManualBuilder manualBuilder = new CarManualBuilder();// Director may know several building recipes.director.constructSportsCar(manualBuilder);Manual carManual = manualBuilder.getResult();System.out.println("\nCar manual built:\n" + carManual.print());}}
OutputDemo.txt: 执行结果
Car built:
SPORTS_CARCar manual built:
Type of car: SPORTS_CAR
Count of seats: 2
Engine: volume - 3.0; mileage - 0.0
Transmission: SEMI_AUTOMATIC
Trip Computer: Functional
GPS Navigator: Functional
相关文章:
设计模式——建造者模式(Java示例)
引言 生成器是一种创建型设计模式, 使你能够分步骤创建复杂对象。 与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的产品成为可能。 复杂度: 中等 流行度: 流行 使用示例:…...
深入探索 Spring Boot:简化开发,加速部署的全方位利器
目录 导言 1. 自动配置(Auto-Configuration) 2. 起步依赖(Starter Dependencies) 3. 嵌入式 Web 服务器 4. Actuator 5. 外部化配置 6. 简化的安全性配置 7. Spring Boot CLI 8. Spring Boot DevTools 导言 在当今软件开…...
SpectralGPT: Spectral Foundation Model 论文翻译3
遥感领域的通用大模型 2023.11.13在CVPR发表 原文地址:[2311.07113] SpectralGPT: Spectral Foundation Model (arxiv.org) E.消融研究 在预训练阶段,我们对可能影响下游任务表现的各种因素进行了全面研究。这些因素包括掩蔽比、ViT patch大小、数据规…...
ubuntu-c++-可执行模块-动态链接库-链接库搜索-基础知识
文章目录 1.动态链接库简介2.动态库搜索路径3.运行时链接及搜索顺序4.查看可运行模块的链接库5.总结 1.动态链接库简介 动态库又叫动态链接库,是程序运行的时候加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态…...
HTML中使用JavaScript实现一个简单的鼠标悬停特效。
代码中,我们首先在CSS中定义了一个红色的方块,然后使用:hover伪类定义了鼠标悬停时的样式。接着,在JavaScript中定义了一个函数showMessage(),用于在控制台输出一条消息。最后,在HTML中使用<div>标签定义了一个i…...
深入.NET平台和C#编程总结大全
第一章 简单认识.NET框架 (1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework Class Library) 配图: (…...
jOOQ的使用场景
jOOQ的使用场景 jOOQ最初是作为一个库完全是JDBC和所有的数据库交互的抽象层而被创建。 在已有的软件产品中经常遇到的各种最佳实践被应用到这个库中。包含如下: 类型安全数据库对象引用,通过自动生成的模式, 表, 列,…...
Pytorch-Transformer轴承故障一维信号分类(三)
目录 前言 1 数据集制作与加载 1.1 导入数据 第一步,导入十分类数据 第二步,读取MAT文件驱动端数据 第三步,制作数据集 第四步,制作训练集和标签 1.2 数据加载,训练数据、测试数据分组,数据分batch…...
pycharm多线程报错的问题(未解决)
暂未解决! 看了一下可能是这里的问题: 根据建议,在walks之前加了 freeze_support() 但是没有效果。 关键是,在jupyter上运行是没有问题的! 未解决。...
【常用字符大全】含emoji表情
常用符号大全 ❤❥웃유♋☮✌☏☢☠✔☑♚▲♪✈✞↑↓◆◇⊙■□△▽─│♥❣♂♀☿Ⓐ✍✉☣☤✘☒♛▼♫⌘☪≈←→◈◎☉★☆⊿※¡━┃♡ღツ☼☁❅♒✎©™Σ✪✯☭➳卐√↖↗●◐Θ◤◥︻〖〗┄┆℃℉✿ϟ☃☂✄¢€£∞✫★✡↙↘○◑⊕◣◢︼【】┅┇…...
android 蓝牙开关设置
frameworks/base/packages/SettingsProvider/res/values/defaults.xml <bool name"def_bluetooth_on">false</bool>将 def_bluetooth_on 的值设为false(系统默认开启值) adb动态设置 关闭:adb shell settings put gl…...
C++ extern “C“ 用法
extern “C” 由于c中需要支持函数重载,所以c和c中对同一个函数经过编译后生成的函数名是不相同的 extern “C” 的主要作用就是为了实现c代码能够调用其他 c 语言代码。 1(不常用) //告诉编译器 show() 函数按c语言的方式进行编译和链接 extern "C" voi…...
HTML面试题---专题四
文章目录 一、前言二、如何在 HTML 中嵌入音频文件?三、解释 <script> 标签中 defer 属性的用途。四、如何在 HTML 中创建粘性/固定导航栏?五、HTML 中的 span 元素的用途是什么?六、如何使 HTML 元素可拖动?七、解释 <i…...
stm32项目(11)——基于stm32的俄罗斯方块游戏机
1.功能设计 使用stm32f103zet6平台,以及一块LCD屏幕,实现了一个俄罗斯方块游戏机。可以用按键调整方块的位置、还可以控制方块下降的速度! 2.视频演示 俄罗斯方块 3.俄罗斯方块发展史 俄罗斯方块是一种经典的拼图游戏,由苏联俄罗…...
【计算机网络基础2】IP地址和子网掩码
1、IP地址 网络地址 IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。 广播地址 广播地址通常称为直接广播地址,是为了区分受限广播地址。 广播地址与网络地址的主机号正…...
ES6-import后是否有{}的区别
在ES6中,import语句用于导入其他模块中的变量、函数、类等。在使用import语句时,可以选择是否使用花括号{}来包裹导入的内容,这会影响导入的内容的使用方式。 1.使用花括号{}: 当使用花括号{}时,表示只导入指定的变量…...
rv1126-rv1109-以太网功能-eth-(原理篇)
这里只是浅浅分析一下 1.主控里面会内置mac 2.mac有组接口接到phy(网络芯片:8201) 3.phy(网络芯片:8201)接到网口 //这里就到达硬件的接口了,大致就是这个原理; 4.然后涉及到软件部分 就是mdio总线;这个总线是注册phy用的; 如果注册失败会导致网口无法使用 [ 1.002751] m…...
【IDEA】反向撤销操作快捷键 ctrl+shift+z 和搜狗热键冲突的解决办法
当我们执行某些操作时与搜狗热键冲突,直接取消搜狗的快捷键即可!!!以下以 ctrlshiftz 为例。 在输入悬浮框右键找到更多设置 按键里面找到系统功能快捷键设置 取消掉冲突的热键即可...
数据结构之----逻辑结构、物理结构
数据结构之----逻辑结构、物理结构 目前我们常见的数据结构分别有: 数组、链表、栈、队列、哈希表、树、堆、图 而它们可以从 逻辑结构和物理结构两个维度进行分类。 什么是逻辑结构? 逻辑结构是指数据元素之间的逻辑关系,而逻辑结构又分为…...
pip 通过git安装库
举例:安装peft库 git clone https://github.com/huggingface/peft.git cd peft python -m pip install . 解释: 使用git clone克隆PEFT库的代码。进入克隆的目录。使用python -m pip install .来安装PEFT库。 补充:使用pip安装到指定编译器…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
