「全网最细 + 实战源码案例」设计模式——生成器模式

ops/2025/3/4 7:52:46/

核心思想

  • 生成器模式(Builder Pattern)是一种创建型设计模式,用于分步骤构建复杂对象,允许用户通过控制对象构造的过程,定制对象的组成部分,而无需直接实例化它们的细节。建造者模式特别适合构建具有多种配置的复杂对象。


结构

1. Builder(抽象建造者)

  • 定义构造产品的抽象方法,具体建造者将实现这些方法。

2. ConcretBuilder(具体建造者)

  • 实现 Builder 接口,定义构造复杂对象的具体过程。

3. Director(指挥者)

  • 调用建造者的步骤,控制产品的构建流程。

4. Product(产品)

  • 最终构建的复杂对象。

适用场景

  1. 需要创建复杂对象,且对象由多个部分组成,这些部分可能需要动态配置。
  2. 构造过程需要对外隐藏,但允许分步骤构造。
  3. 需要让对象的构造过程和表示分离,提供不同的表示形式。

优缺点

优点:

  1. 更好的控制:通过分步构建产品,细化构造过程。
  2. 代码复用:可以通过不同的具体建造者实现构建不同的产品。
  3. 解耦性:构造和表示分离。

缺点:

  1. 增加复杂性:需要额外定义建造者和指挥者类。
  2. 不适合简单对象:对于简单对象,可能显得过于繁琐。

实现步骤

  1. 定义一个实现 Cloneable 接口的原型类。
  2. 在类中重写 clone() 方法,确保对象的复制逻辑。
  3. 调用原型的 clone() 方法创建新对象。

注意事项

1. 浅拷贝与深拷贝:

  • 浅拷贝:只复制对象的基本数据类型,引用类型属性仍指向原始对象。
  • 深拷贝:不仅复制基本类型,也复制引用类型的对象,创建一个完全独立的副本。

2. Cloneable 接口:

  • 在 Java 中,必须实现 Cloneable 接口并重写 clone() 方法,否则会抛出 CloneNotSupportedException

3. 不适用场景:

  • 对于高度依赖构造函数或不支持 clone() 的框架。

示例


拓展——链式调用

package com.colin.patterns.creational_patterns.chain_builder;public class Phone {private String cpu;private String screen;private String memory;private String mainboard;// 私有构造方法private Phone(Builder builder) {this.cpu = builder.cpu;this.screen = builder.screen;this.memory = builder.memory;this.mainboard = builder.mainboard;}public static final class Builder {private String cpu;private String screen;private String memory;private String mainboard;public Builder cpu(String val) {cpu = val;return this;}public Builder screen(String val) {screen = val;return this;}public Builder memory(String val) {memory = val;return this;}public Builder mainboard(String val) {mainboard = val;return this;}// 使用Builder创建实例public Phone build() {return new Phone(this);}}@Overridepublic String toString() {return "Phone{" +"cpu='" + cpu + '\'' +", screen='" + screen + '\'' +", memory='" + memory + '\'' +", mainboard='" + mainboard + '\'' +'}';}
}
package com.colin.patterns.creational_patterns.chain_builder;public class Client {public static void main(String[] args) {Phone phone = new Phone.Builder().cpu("Intel Core i7").memory("16GB").screen("13.3\"").mainboard("Intel HM").build();System.out.println(phone);}
}

与其他模式的关系

  • 在许多设计工作的初期都会使用工厂方法模式 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式、 原型模式或生成器模式 (更灵活但更加复杂)。
  • 生成器重点关注如何分步生成复杂对象。 抽象工厂专门用于生产一系列相关对象。 会马上返回产品, 则允许你在获取产品前执行一些额外构造步骤。
  • 你可以在创建复杂组合模式树时使用生成器, 因为这可使其构造步骤以递归的方式运行。
  • 你可以结合使用生成器和桥接模式: 类负责抽象工作, 各种不同的负责工作。
  • 抽象工厂、 生成器和原型都可以用单例模式来实现。

http://www.ppmy.cn/ops/154669.html

相关文章

python3+TensorFlow 2.x(四)反向传播

目录 反向传播算法 反向传播算法基本步骤: 反向中的参数变化 总结 反向传播算法 反向传播算法(Backpropagation)是训练人工神经网络时使用的一个重要算法,它是通过计算梯度并优化神经网络的权重来最小化误差。反向传播算法的核…

vue3第三部分--组件通信

title: 组件通信 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端组件通信 目标:重点学习父子组件与兄弟组件的通信方式,以及插槽的作用与使用方式 父子组件通信 主要是通过props和自定义事件来实现 1.1 父 -> 子通信(通过 …

Linux线程安全

文章目录 🥭Linux线程互斥进程线程间的互斥相关背景概念互斥锁mutex互斥锁的接口互斥锁实现原理探究 🍍可重入VS线程安全概念常见的线程不安全的情况常见的线程安全的情况常见的不可重入的情况常见的可重入的情况可重入与线程安全联系可重入与线程安全区…

9 Spark性能优化_RDD算子调优

9 Spark性能优化_RDD算子调优 1. RDD复用2. 尽早filter3. 读取大量小文件-用wholeTextFiles4. mapPartition和foreachPartition5. filtercoalesce/repartition(减少分区)6. 并行度设置7. repartition/coalesce调节并行度8. reduceByKey本地预聚合9. 使用持久化checkpoint10. 使…

在线课堂小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

【Paper Tips】随记2-word版快速删除某字符

写paper时随心记录一些对自己有用的skills与tips。 文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 CtrlH一键全文替换2.2.2 录制宏 三、疑问四、总结 一、待解决问题 1.1 问题描述 word中粘贴部分文字时,格式不对时…

Node相关配置迁移

Node相关 安装和配置 官网下载 Node.js — 在任何地方运行 JavaScript 可参考文章 nodejs的安装和全局配置(超详细哦)_全局安装node-CSDN博客 安装完成后检查是否安装成功 node -vnpm -v全局配置环境变量 主要配置的是npm安装的全局模块所在的路径,以及缓存c…

前端开发中的最新技术——CSS Container Queries: 自适应布局的新纪元

在前端开发领域,响应式设计早已成为必备技能。随着屏幕尺寸的多样化,我们需要不断优化页面布局以适应不同的设备和屏幕。现有的技术,如媒体查询(Media Queries),虽然能够在不同的屏幕尺寸下提供基础的布局控…