【Java 设计模式】创建型之建造者模式

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 4. 应用示例
    • 结语

在软件开发中,建造者模式是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常包括一个指导者(Director)类和多个建造者(Builder)类,指导者负责组织建造者的构建过程,而建造者负责具体的构建步骤。在本文中,我们将介绍 Java 设计模式中的建造者模式,了解其定义、使用场景以及如何在实际开发中应用。

1. 定义

建造者模式是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式的核心思想是将一个复杂对象的构建过程封装在一个指导者类中,由多个建造者类负责具体的构建步骤。客户端通过指导者类调用建造者的方法来完成对象的构建。

2. 应用场景

建造者模式的应用场景包括但不限于以下情况:

  • 构建复杂对象:

    当一个对象的构建过程比较复杂,涉及到多个步骤或者需要进行多次配置时,可以使用建造者模式将构建过程分解成多个步骤

  • 创建不同表示:

    当需要创建不同表示的对象时,可以使用相同的构建过程,但由不同的建造者类负责实际的构建

  • 避免构造器参数过多:

    当一个类的构造器参数过多,导致构造器方法签名冗长,可以使用建造者模式将参数分解到不同的建造者方法中,提高代码的可读性

3. 代码实现

建造者模式的实现主要涉及以下几个角色:

在这里插入图片描述

  • 产品类(Product): 定义了要构建的复杂对象
  • 抽象建造者接口(Builder): 定义了构建复杂对象的抽象方法,包括设置对象的各个部分
  • 具体建造者类(ConcreteBuilder): 实现了抽象建造者接口,负责具体的构建步骤,通常包括设置对象的属性、组装部件等
  • 指导者类(Director): 负责组织建造者的构建过程,按照一定的顺序调用建造者的方法来构建对象

下面是一个简单的建造者模式的实现示例:

1)创建一个产品类 Product,拥有着自己的属性,此处拥有 attribute1 和 attribute2

Product.java

package com.cheney.demo;class Product {private final String attribute1;private final String attribute2;public Product(String attribute1, String attribute2) {this.attribute1 = attribute1;this.attribute2 = attribute2;}public String getAttribute1() {return attribute1;}public String getAttribute2() {return attribute2;}public void display() {System.out.println("Product: " + attribute1 + " " + attribute2);}
}

2)创建建造者接口 Builder 及它的实现类 ProductBuilder

Builder.java

package com.cheney.demo;interface Builder {void buildAttribute1(String buildAttribute1);void buildAttribute2(String buildAttribute2);Product getResult();
}

ProductBuilder.java

package com.cheney.demo;class ProductBuilder implements Builder {private Product product;public ProductBuilder() {this.product = new Product("", "");}@Overridepublic void buildAttribute1(String attribute1) {product = new Product(attribute1, product.getAttribute2());}@Overridepublic void buildAttribute2(String attribute2) {product = new Product(product.getAttribute1(), attribute2);}@Overridepublic Product getResult() {return product;}
}

3)创建一个导者类 ProductDirector

ProductDirector.java

package com.cheney.demo;public class ProductDirector {private final ProductBuilder productBuilder;public ProductDirector(ProductBuilder productBuilder) {this.productBuilder = productBuilder;}public void construct() {productBuilder.buildAttribute1("1");productBuilder.buildAttribute2("cheney");}
}

在上述示例中,Product 是产品类,定义了要构建的复杂对象。Builder 是抽象建造者接口,定义了构建复杂对象的抽象方法。ProductBuilder 是具体建造者类,实现了抽象建造者接口,负责具体的构建步骤。ProductDirector 是指导者类,负责组织建造者的构建过程。

4. 应用示例

假设我们想吃汉堡,需要制作一个汉堡包。汉堡包包括面包和肉等属性。我们可以使用建造者模式来制作汉堡包

1)创建一个汉堡包产品类,拥有着自己的属性

Hamburger.java

package com.cheney.demo;public class Hamburger {private final String bread;private final String meat;public Hamburger(String bread, String meat) {this.bread = bread;this.meat = meat;}public String getBread() {return bread;}public String getMeat() {return meat;}public void get() {System.out.println("Hamburger: " + bread + "+" + meat);}
}

2)创建汉堡包建造者接口 及 它的实现类

HamburgerBuilder.java

package com.cheney.demo;interface HamburgerBuilder {void buildBread(String bread);void buildMeat(String meat);Hamburger getResult();
}

ConcreteHamburgerBuilder.java

package com.cheney.demo;class ConcreteHamburgerBuilder implements HamburgerBuilder {private Hamburger hamburger;public ConcreteHamburgerBuilder() {this.hamburger = new Hamburger("", "");}@Overridepublic void buildBread(String bread) {hamburger = new Hamburger(bread, hamburger.getMeat());}@Overridepublic void buildMeat(String meat) {hamburger = new Hamburger(hamburger.getBread(), meat);}@Overridepublic Hamburger getResult() {return hamburger;}
}

3)创建一个导者类

HamburgerDirector.java

package com.cheney.demo;class HamburgerDirector {private final HamburgerBuilder hamburgerBuilder;public HamburgerDirector(HamburgerBuilder hamburgerBuilder) {this.hamburgerBuilder = hamburgerBuilder;}public void construct() {hamburgerBuilder.buildBread("三片面包");hamburgerBuilder.buildMeat("两片牛肉");}
}

在上述示例中,Hamburger 是产品类,定义了要构建的复杂对象。HamburgerBuilder 是抽象建造者接口,定义了构建复杂对象的抽象方法。ConcreteHamburgerBuilder 是具体建造者类,实现了抽象建造者接口,负责具体的构建步骤。HamburgerDirector 是指导者类,负责组织建造者的构建过程。

在使用中,我们可以通过以下方式制作汉堡包:

package com.cheney.demo;public class Main {public static void main(String[] args) {// 创建 汉堡包建造者HamburgerBuilder hamburgerBuilder = new ConcreteHamburgerBuilder();// 创建指导者并设置建造者HamburgerDirector hamburgerDirector = new HamburgerDirector(hamburgerBuilder);// 指导建造者构建汉堡包hamburgerDirector.construct();// 获取构建好的汉堡包Hamburger hamburger = hamburgerBuilder.getResult();// 获取汉堡包hamburger.get();}
}

执行结果

在这里插入图片描述

结语

建造者模式是一种常见且实用的设计模式,它通过将一个复杂对象的构建与其表示分离,使得构建过程可以创建不同的表示。在实际开发中,建造者模式常用于构建复杂对象,避免构造器参数过多导致构造器方法签名冗长的情况。通过合理使用建造者模式,可以使系统更容易扩展和维护。

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

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

相关文章

sfml使用opengl着色器实现2d水面波浪

SFML中使用GLSL着色器来绘制水波。 效果 代码 #include <SFML/Graphics.hpp> #include <iostream>int main() {const int WIDTH = 800;

ZABBIX根据IP列表,主机描述,或IP子网批量创建主机的维护任务

有时候被ZABBIX监控的主机可能需要关机重启等维护操作,为了在此期间不触发告警,需要创建主机的维护任务,以免出现误告警 ZABBIX本身有这个API可供调用(不同版本细节略有不同,本次用的ZABBIX6.*),实现批量化建立主机的维护任务 无论哪种方式(IP列表,主机描述,或IP子网)创建维护…

等离子环制作

免责声明 在您参考该博客制作等离子环前&#xff0c;请仔细阅读以下重要安全警告和免责说明。使用本文档即表示您已充分了解并同意以下条款&#xff1a; 等离子环的危险性&#xff1a;等离子环在运行时玻璃瓶身会产生高温&#xff0c;存在低温烧伤风险。任何时候都不建议用手…

传统语音识别系统流程

文章目录 概述语音识别原理公式语音识别术语&#xff1a;分帧提取声学特征声学模型 概述 语音识别传统方法主要分两个阶段&#xff1a;训练和识别&#xff0c;训练阶段主要是生成声学模型和语言模型给识别阶段用。传统方法主要有五大模块组成&#xff0c;分别是特征提取&#…

荣誉艾尔迪亚人的题解

目录 原题描述&#xff1a; 题目背景 题目描述 输入格式 输出格式 样例 Input 1 Output 1 Input 2 Output 2 数据范围&#xff1a; 样例解释 主要思路&#xff1a; 代码code&#xff1a; 原题描述&#xff1a; 时间限制: 1000ms 空间限制: 65536kb 题目背景 ​…

接口自动化框架搭建-写在前面

从今天开始&#xff0c;我将带领大家一起学习接口自动化框架的搭建&#xff0c;在学习之前&#xff0c;我们先了解搭建一个接口自动化框架需要具备哪些知识&#xff0c;应该做哪些准备工作 测试开发工程师的入门条件 近几年比较流行测试开发岗位&#xff0c;很多小伙伴都不知…

VBA自学日志

文章目录 前言一、For each 循环二、offset 偏移三、Resize 属性四、Exit 语句五、DO...LOOP语句六、一些错误代码总结七、GOTO语句八、do while 和 do until九、如何在VBA内使用Excel工作表函数十、VBA使用随机数十一、排序总结 前言 VBA自学成柴的第三周 一、For each 循环 …

leetcode 454 四数之和

题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 …

Arduino开发实例-INA219 电流传感器驱动

INA219 电流传感器驱动 文章目录 INA219 电流传感器驱动1、INA219 电流传感器介绍2、硬件准备及接线3、代码实现1、INA219 电流传感器介绍 INA219 模块用于同时测量电流和电压。 该模块使用 I2C 通信传输电压和电流数据。 其他特性: 测量精度:1%最大测量电压:26V最大测量电…

【高等数学之牛莱公式】

一、深入挖掘定积分 二、变限积分 三、变限积分的"天然"连续性 四、微积分基本定理 五、定积分基本方法 5.1、换元法 5.2、分部积分法 六、定积分经典结论 七、区间再现公式 八、三角函数积分变换公式 九、周期函数积分变换公式 十、分段函数求定积分

【C语言编程之旅 6】刷题篇-for循环

第1题 解析 思路&#xff1a; 两个循环进行控制 外层循环控制打印多少行 内部循环控制每行打印多少个表达式以及表达式内容&#xff0c; 比较简单&#xff0c;具体参考代码 #include <stdio.h> int main() {int i 0;//控制行数for(i1; i<9; i){//打印每一行内容&am…

mac 中vscode设置root启动

1. 找到你的vscode app&#xff0c;点击鼠标右键------->选项----->在访达中显示 2. 终端中输入以下命令&#xff0c;不要点回车&#xff0c;不要点回车&#xff0c;输入一个空格 sudo chflags uchg 3. 然后将你的程序拖到终端&#xff0c;会自动…