【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.rhkb.cn/news/239722.html

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

相关文章

如何在 SwiftUI 中实现音频图表

文章目录 前言DataPoint 结构体BarChartView 结构体ContentView 结构体实现协议实现线图总结 前言 在可访问性方面,图表是复杂的事物之一。iOS 15 引入了一项名为“音频图表”的新功能。 下面我们将学习如何通过使用 accessibilityChartDescriptor 视图修饰符为任…

远程开发之vscode端口转发

远程开发之vscode端口转发 涉及的软件forwarded port 通过端口转发,实现在本地电脑上访问远程服务器上的内网的服务。 涉及的软件 vscode、ssh forwarded port 在ports界面中的port字段,填需要转发的IP:PORT,即可转发远程服务器中的内网端…

十、Three场景实现多个物体的合并

Three场景实现多个物体的合并 目的 产品需求是让物体的光柱墙包含一个多边形的区域,二而我的多边形只能使用原型,方向,多边形。那么再研究的时候就需要将这些多边形合并成为一个形状,那么就行实现了。 原先的图形 如上图,是两个mesh组成的。首先寻找mesh合并的方法。 第…

java日志框架总结

一、日志框架简单分类介绍 java常用的日志框架、可以分为两组: 1、JCL、JUL、Log4j; 2、SLF4J、Log4j2、Logback; 其中第一组是比较早期的日志实现框架,JCL并不是具体的日志实现框架,JCL其实是定义了一…

网络安全笔记-SQL注入

文章目录 前言一、数据库1、Information_schema2、相关函数 二、SQL注入分类1、联合查询注入(UNION query SQL injection)语法 2、报错注入(Error-based SQL injection)报错注入分类报错函数报错注入原理 3、盲注布尔型盲注&#…

RK3568笔记八: Display子系统

modetest 是由 libdrm 提供的测试程序,可以查询显示设备的特性,进行基本的显示测试,以及设置显示的模式。 我们可以借助该工具来学习 Linux DRM 应用编程,另外为了深入分析 Rockchip DRM driver,有必要先了解一下这个…

1.环境部署

1.虚拟机安装redhat8系统 这个其实很简单,但是有一点小细节需要注意。 因为我的电脑是 16核心的,所以选择内核16,可以最大发挥虚拟机的性能 磁盘选择SATA,便于后期学习 将一些没用的设备移除 选择安装redhat 8 时间选择上海 选择…

逻辑回归(解决分类问题)

定义:逻辑回归是一种用于解决分类问题的统计学习方法。它通过对数据进行建模,预测一个事件发生的概率。逻辑回归通常用于二元分类问题,即将数据分为两个类别。它基于线性回归模型,但使用了逻辑函数(也称为S形函数&…

用Python“自动连发消息”

自动连发消息,基本上C和Python的思路都是不停的模拟“击键”操作,还有一种VB的脚本写法,反成每种语言都能写,更厉害的可以用java做出个GUI界面,先上代码。 一 代码 import pyautogui # 鼠标 import p…

C++I/O流——(2)预定义格式的输入/输出(第二节)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 含泪播种的人一定能含笑收获&#xff…

web前端第二次

第一题&#xff1a; <!DOCTYPE html> <html> <head><title>计算奇数和</title> </head> <body><label for"input">请输入一个正整数&#xff1a;</label><input type"number" id"input&qu…

vue2使用electron以及打包配置

1.创建项目 vue create vue-project 2.安装electron vue add electron-builder会自动安装相关依赖 安装成功后会在src下自动生成一个background.js文件就是相应的electron的配置信息 use strictimport { app, protocol, BrowserWindow } from electron import { createProto…

如何安装“MySQL在虚拟机ubuntu”win10系统?

1、 更新列表 sudo apt-get update 2、 安装MySQL服务器 sudo apt-get install mysql-server 3、 安装MySQL客户端 sudo apt-get install mysql-client 4、 配置MySQL sudo mysql_secure_installation 5、 测试MySQL systemctl status mysql.service MySQL数据库基本…

【Docker】centos中及自定义镜像,并且上传阿里云仓库可提供使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《【Docker】centos中及自定义镜像&#xff0c;…

GRE隧道(初级VPN)配置步骤

一、拓朴图&#xff1a; 要求&#xff1a;1、PC1 和 PC2 能访问充当互联网接口地址的ISP环回口地址8.8.8.8 2、PC1 和 PC2 走GRE隧道互通 二、配置步骤&#xff1a; 1、配置IP 2、R1、R2 配置nat&#xff0c;代理内网地址通过G0/0/0口上外网 acl 2000rule permit source a…

Flutter首页框架搭建

1.下载flutter 2. 安装android 3.配置环境变量 关于环境搭建部分&#xff0c;哪天写一下&#xff0c;日志杂乱无章。 打开android studio 新建项目&#xff0c;选择flutter 新建文件夹创建 navigator和pages 文件夹下分别创建文件&#xff0c;tab_navigator.dart&#xff…

快速上手的 AI 工具-文心一言

简介 最近正打得火热的AIGC概念&#xff0c;相信大家肯定也都多少接触到了&#xff0c;那么AIGC概念股到底是什么呢&#xff1f;我个人最近也看了一些平台如&#xff1a;文心一言、通义千问、讯飞星火、豆包等等&#xff01;各位朋友也千万不要错过啦&#xff0c;真是各有各的特…

压缩编码之不同缩放参数对重建图像质量的影响的python实现——JPEG变换编码不同压缩率的模拟

原理 JPEG&#xff08;Joint Photographic Experts Group&#xff09;是一种常用的图像压缩标准&#xff0c;它通过采用离散余弦变换&#xff08;DCT&#xff09;和量化来实现图像的压缩。 离散余弦变换&#xff08;DCT&#xff09;&#xff1a; JPEG首先将图像分割成8x8的块…

跟着pink老师前端入门教程-day03

6. 表格标签 6.1 表格的主要作用 主要用于显示、展示数据&#xff0c;可以让数据显示的规整&#xff0c;可读性非常好&#xff0c;特别是后台展示数据时&#xff0c;能够熟练运用表格就显得很重要。 6.2 基本语法 <!--1. <table> </table> 是用于定义表格的标…

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V1模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V1模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V1模型算法详解前言EfficientNet_V1讲解问题辨析(Problem Formulation)缩放尺寸(Scaling Dimensions)复合缩…