23种设计模式-生成器(Builder)设计模式

news/2024/11/28 14:27:04/

文章目录


类图: 生成器设计模式类图

一.什么是生成器设计模式

生成器模式(Builder Pattern) 是一种创建型设计模式,允许我们分步骤创建复杂对象,同时提供不同的构建方法来定制对象的各个部分。生成器模式将对象的构建过程与其表示分离,使同样的构建过程可以创建不同的表示。

二.生成器模式的特点

  • 分步骤构建复杂对象:将构建过程分解为多个步骤。
  • 产品结构清晰:对每个组件的创建都有明确的逻辑。
  • 支持多样化配置:生成器可以创建不同的对象或表示。

三.生成器模式的结构

  • Builder(生成器接口):定义构建对象的步骤。
  • ConcreteBuilder(具体生成器):实现生成器接口,完成具体步骤并生成对象。
  • Director(指挥者):控制对象构建的流程和顺序。
  • Product(产品):表示最终创建的复杂对象。
    在这里插入图片描述

四.生成器模式的优缺点

  • 优点:
    • 代码清晰:分离了构造逻辑和产品类,符合单一职责原则。
    • 灵活性强:构造步骤可以灵活调整,支持多样化的产品表示。
    • 可扩展性好:可以轻松增加新的生成器,而不影响已有代码。
  • 缺点:
    • 实现较复杂:需要引入多个类(生成器、指挥者、产品)。
    • 使用场景有限:主要用于构建过程复杂的对象,对于简单对象不适用。

五.生成器模式的 C++ 实现

#include <iostream>
#include <string>
#include <memory>
using namespace std;// 产品类
class Product {
private:string partA;string partB;string partC;public:void SetPartA(const string& part) { partA = part; }void SetPartB(const string& part) { partB = part; }void SetPartC(const string& part) { partC = part; }void Show() const {cout << "Product built with: " << endl;cout << "  PartA: " << partA << endl;cout << "  PartB: " << partB << endl;cout << "  PartC: " << partC << endl;}
};// 抽象生成器
class Builder {
public:virtual ~Builder() = default;virtual void BuildPartA() = 0;virtual void BuildPartB() = 0;virtual void BuildPartC() = 0;virtual shared_ptr<Product> GetResult() = 0;
};// 具体生成器
class ConcreteBuilder : public Builder {
private:shared_ptr<Product> product;public:ConcreteBuilder() { Reset(); }void Reset() { product = make_shared<Product>(); }void BuildPartA() override { product->SetPartA("Concrete PartA"); }void BuildPartB() override { product->SetPartB("Concrete PartB"); }void BuildPartC() override { product->SetPartC("Concrete PartC"); }shared_ptr<Product> GetResult() override {auto result = product;Reset(); // 重置生成器以备下次使用return result;}
};// 指挥者
class Director {
private:Builder* builder;public:void SetBuilder(Builder* b) { builder = b; }void ConstructMinimalProduct() {builder->BuildPartA();}void ConstructFullProduct() {builder->BuildPartA();builder->BuildPartB();builder->BuildPartC();}
};// 客户端代码
int main() {ConcreteBuilder builder;Director director;director.SetBuilder(&builder);cout << "Building minimal product:" << endl;director.ConstructMinimalProduct();auto product1 = builder.GetResult();product1->Show();cout << "\nBuilding full product:" << endl;director.ConstructFullProduct();auto product2 = builder.GetResult();product2->Show();return 0;
}

六.生成器模式的 Java 实现

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("Product built with:");System.out.println("  PartA: " + partA);System.out.println("  PartB: " + partB);System.out.println("  PartC: " + partC);}
}// 抽象生成器
interface Builder {void buildPartA();void buildPartB();void buildPartC();Product getResult();
}// 具体生成器
class ConcreteBuilder implements Builder {private Product product;public ConcreteBuilder() { reset(); }private void reset() { product = new Product(); }@Overridepublic void buildPartA() { product.setPartA("Concrete PartA"); }@Overridepublic void buildPartB() { product.setPartB("Concrete PartB"); }@Overridepublic void buildPartC() { product.setPartC("Concrete PartC"); }@Overridepublic Product getResult() {Product result = product;reset(); // 重置生成器以备下次使用return result;}
}// 指挥者
class Director {private Builder builder;public void setBuilder(Builder builder) { this.builder = builder; }public void constructMinimalProduct() {builder.buildPartA();}public void constructFullProduct() {builder.buildPartA();builder.buildPartB();builder.buildPartC();}
}// 客户端代码
public class BuilderPatternExample {public static void main(String[] args) {ConcreteBuilder builder = new ConcreteBuilder();Director director = new Director();director.setBuilder(builder);System.out.println("Building minimal product:");director.constructMinimalProduct();Product product1 = builder.getResult();product1.show();System.out.println("\nBuilding full product:");director.constructFullProduct();Product product2 = builder.getResult();product2.show();}
}

七.代码解析

  • 产品类(Product)
    • 包含产品的各个组成部分(PartA、PartB 和 PartC)。
    • 提供 SetPartX 方法,用于设置对应组件值。
    • 提供 Show 方法,展示产品的状态。
  • 抽象生成器(Builder)
    • 定义了构建产品的各个步骤(BuildPartA、BuildPartB、BuildPartC)。
    • 提供 GetResult 方法,返回构建完成的产品对象。
  • 具体生成器(ConcreteBuilder)
    • 实现抽象生成器接口,提供具体的构建逻辑。
    • 包括一个 Reset 方法,用于每次构建完成后重置状态
  • 指挥者(Director):
    • 控制构建流程,按照特定顺序调用生成器的方法。
    • 提供 ConstructMinimalProduct 和 ConstructFullProduct 方法,分别展示构建简单和完整产品的流程。
  • 客户端代码
    • 创建 ConcreteBuilder 和 Director 对象。
    • 指挥者调用生成器的方法,完成产品构建。
    • 构建完成后,通过 GetResult 获取最终的产品对象,并调用 Show 方法展示产品。

八. 总结

生成器模式通过分步骤构建复杂对象,解决了构造函数参数过多或对象构建逻辑复杂的问题。它将对象的构造过程与表示分离,使得同样的构造过程可以生成不同的产品。在实现时需要注意保持生成器的灵活性,同时避免产品类与生成器之间的强耦合。
应用场景:

  • 创建复杂对象:对象的构造涉及多个步骤或多个组成部分。
  • 代码复用:将对象的构建逻辑集中到生成器中,避免重复代码。
  • 灵活构建:构建相同类型的对象时,可以通过不同的生成器创建不同的表示。

http://www.ppmy.cn/news/1550637.html

相关文章

外卖点餐系统小程序

目录 开发前准备 项目展示项目分析项目初始化封装网络请求 任务1 商家首页 任务分析焦点图切换中间区域单击跳转到菜单列表底部商品展示 任务2 菜单列表 任务分析折扣信息区设计菜单列表布局请求数据实现菜单栏联动单品列表功能 任务3 购物车 任务分析设计底部购物车区域添加商…

如何用通义灵码快速绘制流程图?

使用通义灵码快速绘制流程图&#xff1f;新功能体验 不想读前人“骨灰级”代码&#xff0c;不想当“牛马”程序员&#xff0c;想像看图片一样快速读复杂代码和架构&#xff1f; 通义灵码已经支持代码逻辑可视化&#xff0c;可以把你的每段代码画成流程图。像个脑图工具一样帮你…

深度学习 | 什么是知识图谱

来源 2012年5月17日&#xff0c;Google 正式提出了知识图谱(Knowledge Graph)的概念&#xff0c;其初衷是为了优化搜索引擎返回的结果&#xff0c;增强用户搜索质量及体验。 实际上&#xff0c;知识图谱并不是一个全新的概念&#xff0c;早在 2006 年就有文献提出了语义网(Sema…

Hbase 部署

HBase是一个分布式的、面向列的开源数据库&#xff0c;它是Apache Hadoop项目的子项目。为了成功部署HBase&#xff0c;可以按照以下步骤进行&#xff1a; 主机部署 一、准备环节 设备基本要求&#xff1a; Hadoop和ZooKeeper&#xff1a;HBase集群需要依赖Hadoop和Zookeepe…

Linux介绍与安装指南:从入门到精通

1. Linux简介 1.1 什么是Linux&#xff1f; Linux是一种基于Unix的操作系统&#xff0c;由Linus Torvalds于1991年首次发布。Linux的核心&#xff08;Kernel&#xff09;是开源的&#xff0c;允许任何人自由使用、修改和分发。Linux操作系统通常包括Linux内核、GNU工具集、图…

【H2O2|全栈】JS进阶知识(十一)axios入门

目录 前言 开篇语 准备工作 获取 介绍 使用 结束语 前言 开篇语 本系列博客主要分享JavaScript的进阶语法知识&#xff0c;本期主要对axios进行基本的了解。 与基础部分的语法相比&#xff0c;ES6的语法进行了一些更加严谨的约束和优化&#xff0c;因此&#xff0c;在…

网络基础 - 地址篇

一、IP 地址 IP 协议有两个版本&#xff0c;IPv4 和 IPv6IP 地址(IPv4 地址)是一个 4 字节&#xff0c;32 位的正整数&#xff0c;通常使用 “点分十进制” 的字符串进行表示&#xff0c;例如 192.168.0.1&#xff0c;用点分割的每一个数字表示一个字节&#xff0c;范围是 0 ~…

逻辑处理器核心指纹修改

navigator.hardwareConcurrency的属性,可以用来获取CPU的逻辑处理器核心数。 1、navigator.hardwareConcurrency接口定义&#xff1a; third_party\blink\renderer\core\frame\navigator_concurrent_hardware.idl // https://html.spec.whatwg.org/C/#navigator.hardwarecon…