Java设计模式之一:建造者模式

news2024/9/19 8:05:23

目录

一、什么是建造者模式

二、建造者模式如何使用

三、建造者模式的优势和应用场景


一、什么是建造者模式

Java建造者模式是一种创建对象的设计模式,它通过将对象的构造过程分离出来,使得同样的构建过程可以创建不同的表示。建造者模式适用于创建复杂对象,它将对象的构建过程分解成多个步骤,每个步骤由一个具体的建造者来负责,最终由一个指挥者来组装这些部件。

在建造者模式中,通常包含以下几个角色:

  1. 产品(Product):表示被构建的复杂对象,包含多个组成部分。
  2. 抽象建造者(Builder):定义对象的构建步骤和接口,具体建造者需要实现这个接口来创建不同的产品。
  3. 具体建造者(Concrete Builder):实现抽象建造者接口,负责具体的构建过程,包括构建各个部件和返回最终构建的产品。
  4. 指挥者(Director):负责调用具体建造者的方法来构建产品,控制构建的流程和顺序。

使用建造者模式可以将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示,提高了代码的复用性和灵活性。同时,建造者模式也可以隐藏产品的构建细节,使得客户端不需要知道具体的构建过程,只需要通过指挥者来创建产品即可。

 

二、建造者模式如何使用

以下是一个使用Java建造者模式的示例代码:
 

// 产品类
class Product {
    private String partA;
    private String partB;
    private String partC;

    public void setPartA(String partA) {
        this.partA = partA;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }

    public void setPartC(String partC) {
        this.partC = partC;
    }

    public void show() {
        System.out.println("Part A: " + partA);
        System.out.println("Part B: " + partB);
        System.out.println("Part C: " + partC);
    }
}

// 抽象建造者
interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
    Product getResult();
}

// 具体建造者
class ConcreteBuilder implements Builder {
    private Product product;

    public ConcreteBuilder() {
        this.product = new Product();
    }

    @Override
    public void buildPartA() {
        product.setPartA("Part A");
    }

    @Override
    public void buildPartB() {
        product.setPartB("Part B");
    }

    @Override
    public void buildPartC() {
        product.setPartC("Part C");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

// 指挥者
class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

// 客户端代码
public class BuilderPatternExample {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.construct();
        Product product = builder.getResult();
        product.show();
    }
}

在以上示例中,我们定义了一个产品类。


Product,其中包含了三个部件partApartBpartC。抽象建造者Builder定义了产品的构建步骤和接口,具体建造者ConcreteBuilder实现了抽象建造者接口,并负责具体的构建过程。指挥者Director负责调用具体建造者的方法来构建产品,控制构建的流程和顺序。

在客户端代码中,我们创建了一个具体建造者ConcreteBuilder的实例,并将其传递给指挥者Director。然后调用指挥者的construct()方法来构建产品,最后通过具体建造者的getResult()方法获取构建完成的产品。最终调用产品的show()方法展示产品的部件信息。


三、建造者模式的优势和应用场景

  •  建造者模式的优势
  1. 将复杂对象的创建过程封装在具体的建造者中,使得代码结构清晰,易于理解和维护。
  2. 可以通过改变具体建造者来创建不同的产品表示,灵活性高。
  3. 隐藏了产品的构建细节,使客户端不需要关心具体的建造过程,只需要通过指挥者来获取最终的产品。
  • 建造者模式的应用场景
  1. 当对象的构建过程较为复杂,需要多个步骤,并且可以有不同的表示时,可以考虑使用建造者模式。
  2. 当需要创建的对象包含多个部分,并且这些部分之间有一定的依赖关系时,可以使用建造者模式来确保部件的组装顺序和正确性。
  3. 当希望隐藏对象的构建细节,只向客户端暴露一个简单的构建接口时,可以使用建造者模式。
  4. 当需要创建的对象具有复杂的内部结构,但外部只需要关注其高层次的表示时,可以使用建造者模式。

总的来说,建造者模式适用于构建过程复杂、对象组成部分多且可变、希望隐藏构建细节的场景,能够提高代码的可读性、灵活性和可维护性。

 

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

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

相关文章

在前端页面正确展示后端返回的验证码图片

前言: 在开发登录界面时,通过接口请求验证码;后端给返回的格式是Blob,直接用src引用没办法显示。 在控制台输入结果是: 第一想法就是通过 window.URL.createObjectURL(new Blob([res.data],{type:image/png}))转换成u…

【底部消息红点提示】uniapp开发小程序时,使用uni.setTabBarBadge设置底部菜单的红点

一、实现的效果 功能描述:无论点击底部的哪个菜单栏,都可以看到第二个菜单栏下显示的红点通知。 如果只在人脉当前页面设置的话,当你在第二个菜单栏的页面中调用uni.setTabBarBadge方法设置红点后,切换到第一个菜单栏的页面时&am…

力扣 332. 重新安排行程

题目来源:https://leetcode.cn/problems/reconstruct-itinerary/description/ C题解(来源代码随想录): 这道题目有几个难点: 一个行程中,如果航班处理不好容易变成一个圈,成为死循环。解决&am…

【论文基本功】【LaTeX】附录【IEEE论文】

注意:本博客使用的所有命令都需要以使用 IEEEtran 文档类为前提,即 tex 文件的第一行中的必须是 \documentclass[可选参数]{IEEEtran}(可选参数部分可以自由选择,如 \documentclass[10pt,journal,compsoc]{IEEEtran}。&#xff09…

C++primer(第五版)第十三章(拷贝控制)

一个类通过定义五种特殊的成员函数来控制这些操作: 拷贝构造函数 拷贝赋值运算符 移动构造函数 移动赋值运算符 析构函数 13.1拷贝,赋值与销毁 13.1.1拷贝构造函数 如果一个构造函数的第一个参数是自身类型的引用(必须是引用类型!),并且没有其他参数或是其他参数都有默认值(即…

基于matlab检测使用校准的立体摄像头拍摄的视频中的人物并确定其与摄像头的距离(附源码)

一、前言 此示例演示如何检测使用校准的立体摄像头拍摄的视频中的人物,并确定他们与摄像头的距离。 二、加载立体摄像机的参数 加载对象,这是使用应用程序或函数校准相机的结果。 三、创建视频文件阅读器和视频播放器 创建用于读取和显示视频的系统对…

LabVIEW开发X射线图像增强

LabVIEW开发X射线图像增强 X射线图像在临床诊断中起着重要作用。但是,由于各种原因,例如不均匀,低照度条件和一些噪点,图像质量通常不是很好。因此有必要增强这些图像,以方便后续处理或诊断。模糊集论是开发图像处理中…

C# Color的名称对应该工具

工具效果如下图: 代码: namespace WinFormsColor {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void displayColor(){Control listControl this.Controls["listView_Color"];if (listControl ! null)…

mysql的一些练习题

1. 第1题 mysql> create database Market charset utf8; Query OK, 1 row affected (0.01 sec)第二题 mysql> use Market Database changed mysql> mysql> create table customers(-> c_num int(11) primary key auto_increment,-> c_name varchar(50),-&…

【自动化测试】

一、自动化测试定义 首先来说一下什么是软件测试? 软件测试简单来说就是在规定的条件下对程序进行操作以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 那么什么是自动化测试呢? 自动化测试是把以人为驱动的测试…

使用Jxbrowser7替换浏览器请求内容和header

前几天一个伙计让我帮他做jxbrowser的请求内容(requestBody,Header)的替换,特此记录。 通过官网文档查阅,我们可以通过BeforeSendUploadDataCallback和BeforeStartTransactionCallback来实现body和header的替换

MySQL之DQL(涵盖所有查询!!!)

文章目录 前言一、基础查询1.1 语法1.2 实例 二、条件查询2.1 语法2.2 条件查询实例2.3 模糊查询实例 三 、排序查询3.1 语法3.2 实例 四 、聚合函数4.1 概念4.2 聚合函数分类4.3 聚合函数语法4.4 实例 五、分组查询5.1 语法5.2 实例 六、分页查询6.1 语法6.2 实例 前言 在上一…

Docker 是什么,在 Ubuntu 虚拟机上安装(部署)Docker

本文目录 1. Docker 简介1.1 什么是 Docker1.2 Docker 与虚拟技术的区别和联系1.3 为什么要用 Docker 2. 几个基本概念2.1 镜像2.1.1 分层存储 2.2 容器2.3 仓库2.3.1 Docker Registry 公开服务2.3.2 私有 Docker Registry 3. Docker 安装3.1 卸载旧版本 Docker3.2 更新及安装工…

Visual Studio 2017下的C++开发环境搭建

Visual Studio 是Microsoft旗下的开发工具包系列产品,是一个基本完整的开发工具集,它包括整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等,是最流行的Windows平台应用程序的集成开发环境。…

动态规划之63 不同路径 II(第5道)

题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那…

ROS-Moveit和Gazebo联合仿真

文章目录 URDF功能包配置configlaunchCMakeLists.txtpackage.xmlurdf文件 Moveit功能包配置configlaunch 运行 URDF功能包配置 config 首先在SW2URDF生成的功能包下Config目录下新建文件joint_trajectory_controller.yaml robot_arm_controller:type: "position_contro…

Tomcat使用数据库连接池数据库

1.连接池技术的作用 数据池允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。这项技术能明显地提高对数据库操作的性能。 2.什么是连接池技术 数据库连接池在初始化时将创建一定数量的数据库连接,具体数量的由连接池的最小数据库连接数来设…

什么是Uniswap v3?

目录 1. 集中化流动性:2. 集中化资金池管理:3. 多个流动性池:4. 高级订单类型:5. 协议费用优化: Uniswap v3 是去中心化交易所 Uniswap 的第三个主要版本,它于2021年5月发布。相比于 Uniswap v2&#xff0c…

内嵌tomcat使用方式(读取web.xml)

pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…

微信小程序之单选题按钮切换背景

先来效果图 未选效果 已选效果 上代码 <view class"questionClass">问题1&#xff1a;夜晚落地西安咯&#xff0c;你最想先去哪里看看呢&#xff1f;</view><view class"single"><ul class"box"><li v-for"(s,i…