设计模式-创建型-建造者模式

devtools/2024/11/25 9:35:01/

1.概念

建造者设计模式(Builder Design Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。

2.作用

用于简化对复杂对象的创建

3.应用场景

当我们有一个非常复杂的对象(属性很多)需要创建并初始化,传统的创建方法有两种:
使用有参构造器一次完成创建与初始化操作
使用构造器完成创建工作,使用set方法完成初始化操作
但上面两个方法都会有相同的问题——代码量太大,可读性差。
所以这个时候我们可以使用建造者模式

4.特点

对象的构建过程与表示分离

5.类与对象关系

有以下角色:

  • 产品:我们实际要创建和使用的复杂对象
  • 抽象建造者:一个用来约束具体建造者的接口
  • 具体建造者:实际完成对象的初始化操作
  • 指挥者(可选):提供一些默认情况下的初始化配置

6.实现

假设我们现在要创建一个产品——Computer
它包含四个主要部分:CPU、RAM、存储(storage)和GPU。
Computer类(产品)和builder内部类(建造者)

java">// 产品类:Computer
public class Computer {private String cpu;private String ram;private String storage;private String gpu;// 私有构造方法,防止外部直接实例化private Computer(Builder builder) {this.cpu = builder.cpu;this.ram = builder.ram;this.storage = builder.storage;this.gpu = builder.gpu;}// 内部静态Builder类(建造者)public static class Builder {private String cpu;private String ram;private String storage;private String gpu;// 设置CPUpublic Builder setCpu(String cpu) {this.cpu = cpu;return this;}// 设置RAMpublic Builder setRam(String ram) {this.ram = ram;return this;}// 设置存储public Builder setStorage(String storage) {this.storage = storage;return this;}// 设置GPUpublic Builder setGpu(String gpu) {this.gpu = gpu;return this;}// 构建Computer对象public Computer build() {return new Computer(this);}}@Overridepublic String toString() {return ("Computer{" +"cpu='" +cpu +'\'' +", ram='" +ram +'\'' +", storage='" +storage +'\'' +", gpu='" +gpu +'\'' +'}');}
}

该例子中,我们可以看出:

  • 我们不能直接为Computer类的属性进行赋值,而是使用builder为其赋值
  • 在builder中进行赋值后从builder中取出值传递给Computer类,来完成初始化
  • 使用Builder类的各个set方法设置完属性后,使用build方法构建出对象

Director类(指挥者)(可选)

java">// 指挥者类(可选)  
public class ComputerDirector {  private Computer.Builder builder;  public ComputerDirector(Computer.Builder builder) {  this.builder = builder;  }  // 示例构建方法  public Computer constructGamingComputer() {  return builder  .setCpu("Intel i9")  .setRam("32GB")  .setStorage("1TB SSD")  .setGpu("NVIDIA RTX 3080")  .build();  }  // 其他构建方法可以根据需要添加  
}

指挥者类在这个例子中不是必须的,这里只是用来提供一些默认配置,让我们能更快的创建并初始化出一个对象

测试类

java">public class Main {  public static void main(String[] args) {  // 使用Builder直接构建  Computer gamingComputer = new Computer.Builder()  .setCpu("Intel i7")  .setRam("16GB")  .setStorage("512GB SSD")  .setGpu("NVIDIA RTX 3070")  .build();  System.out.println(gamingComputer);  // 使用Director构建(可选)  ComputerDirector director = new ComputerDirector(new Computer.Builder());  Computer highEndComputer = director.constructGamingComputer();  System.out.println(highEndComputer);  }  
}

正常使用建造者模式,我们需要使用Builder对象进行赋值,然后最终使用build方法创建对象。
使用指挥者后,因为里面已经有默认配置,所以可以直接创建出对象,更高效。


http://www.ppmy.cn/devtools/136806.html

相关文章

P1 练习卷(C++4道题)

1.纷繁世界 内存限制:256MB 时间限制:1s 问题描述 这是一个纷繁复杂的世界。 某一天清晨你起床很迟,没有吃上早饭。于是你骑着自行车去超市,但是你又发现商店的工作人员已经重新贴上了价格标签,零食价格都涨了50%。你…

Redis核心数据结构与高性能原理

一、Redis安装 下载地址:http://redis.io/download 安装步骤: # 安装gcc yum install gcc# 把下载好的redis-5.0.3.tar.gz放在/usr/local文件夹下,并解压 wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar -zxvf redis-5.0.3…

深入理解 prompt提示词 原理及使用技巧

引言 在现代深度学习和人工智能领域,文本到图像生成模型(如 Stable Diffusion、DALL-E 等)已经取得了显著的进展。这些模型能够根据给定的文本提示词生成高质量的图像,极大地拓展了创意设计和艺术创作的可能性。然而,…

[高阶数据结构四] 初始图论

1.前言 本篇着重讲解图的相关知识,大家跟随我的脚步往下阅读。 本章重点: 本章着重讲解图的基本知识,图的存储结构:邻接矩阵,邻接表以及图的模拟实现 2.图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构…

[OpenHarmony5.0][环境][教程]OpenHarmony 5.0源码在WSL2 Ubuntu22.04 编译环境搭建教程

F. 前言 教程基于OpenHarmony5.0 Release(以下简称OHS_5),WSL2,Ubuntu22.04 为什么做这个教程?官方的文档写的比较乱,个人也是试了好久才搞出来环境。这里记录一下。 为什么用WSL?因为官方的…

python基于RSA算法的数字签名生成软件(附源码,文档)

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

银行卡OCR 识别 API 接口如何用Java如何调用

银行卡 OCR 识别是利用光学字符识别技术,对银行卡上的卡号、有效期、持卡人姓名等信息进行快速、准确识别的过程。而银行卡 OCR 识别 API 接口则是将这种识别能力以接口的形式提供给开发者,使其能够轻松地集成到各种应用程序中,实现对银行卡信…

20241124 Typecho 视频插入插件

博文免不了涉及到视频插入这些,网上的插件都或多或少的比较重,和Typecho的风格不搭配 后面就有了DPlay插件精简而来的VideoInsertion插件 VideoInsertion: Typecho 视频插入插件 目录结构 rockhinlink-ht2:/var/www/html/typecho/usr/plugins/VideoInsertion$ tree -h [4.…