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

embedded/2024/11/26 17:32:07/

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/embedded/140673.html

相关文章

Leetcode 组合

使用回溯来解决此问题。 提供的代码使用了回溯法(Backtracking),这是一种通过递归探索所有可能解的算法思想。以下是对算法思想的详细解释: 核心思想: 回溯法通过以下步骤解决问题: 路径选择&#xff1a…

51单片机-独立按键与数码管联动

独立键盘和矩阵键盘检测原理及实现 键盘的分类:编码键盘和非编码键盘 键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如:计算机键盘。靠软件编程识别的称为非编码键盘;在单片机组成…

享元模式 (Flyweight Pattern)

享元模式 (Flyweight Pattern) 享元模式是一种 结构型设计模式,通过共享相同对象,减少内存使用,提升系统性能。该模式适用于大量相似对象的场景,能有效避免重复创建相同对象。 原理 核心思想: 将对象的 内在状态&…

【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!

文章目录 修改哈希表模板参数迭代器HashTable 的默认成员函数HashTable 迭代器相关函数HashTable 的 Insert 函数HashTable 的 Find函数HashTable 的 Erase函数 封装 unordered_set封装 unordered_map测试 unordered_set 和 unordered_map 修改哈希表 我们基于链地址法实现的哈…

虚拟浏览器可以应对哪些浏览器安全威胁?

众所周知,互联网安全对企业和个人都至关重要。 因此,在有害的网络内容和终端用户之间必须有一道屏障。浏览器隐私是浏览器安全的一个重要组成部分。不用说也知道,大多数常用的浏览器,都会把最终用户的数据出售给第三方&#xff0c…

git教程

文章目录 简介:使用教程:(1)安装git:(2)设置用户名和邮箱作为标识符:(3)建立本地仓库:本地仓库作用:(1)将文件…

springboot获取配置文件中的值

概括 在开发过程中,对于一些通用的配置,通常会定在一个配置文件中。通常为application.properties或者application.yml文件中。我们只需要在需要使用的地方通过注解直接获取即可。 使用 在springboot中可以通过使用value注解来读取配置文件中的属性。…

随手记:鼠标触顶方法

// 鼠标触顶方法 scrollMethod() { window.onscroll () > { let t document.documentElement.scrollTop || document.body.scrollTop; if(t > 10) { this.positionStyle.top 0px; }else{ this.positionStyle.top 128px; } } },