建造者模式详解

简介: 建造者模式是一种创建型设计模式,通过将对象的构造与表示分离,使得同样的构建过程可以创建不同的对象。它适用于复杂对象的构建,如汽车制造、软件配置生成等场景。该模式的核心角色包括抽象建造者、具体建造者、产品和指挥者。优点包括解耦构造和表示、代码复用性强、易于扩展;缺点是增加代码复杂度,对产品组成部分有依赖。

建造者模式详解

定义

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


建造者模式的特点

优点

  1. 解耦构造和表示:构造复杂对象时可以灵活改变其内部结构或表示。
  2. 代码复用性强:不同的具体建造者可以复用相同的构造过程。
  3. 易于扩展:增加新的建造者无需修改已有代码,符合开闭原则。

缺点

  1. 增加代码复杂度:需要为每个产品定义具体的建造者。
  2. 对产品组成部分有依赖:如果产品结构变化,所有建造者都需要修改。

适用场景

  1. 复杂对象的构建
    需要多个步骤构建的对象,如嵌套、依赖其他对象的初始化等。
  2. 构建过程稳定,产品表示多样化
    不同的表示方式(如不同配置的车辆、不同风格的房屋)。
  3. 对象构造步骤依赖顺序
    例如必须先初始化再添加组件。

建造者模式的结构

核心角色

  1. 抽象建造者(Builder):定义构建产品的步骤。
  2. 具体建造者(Concrete Builder):实现步骤以构建具体产品。
  3. 产品(Product):最终构建的复杂对象。
  4. 指挥者(Director):调用建造者的步骤来创建产品。

使用案例

案例 1:汽车制造

不同配置的汽车(如电动车、SUV),但装配过程类似。

案例 2:软件配置生成器

根据用户输入生成复杂的配置文件。

案例 3:餐馆点餐

不同种类的套餐,包含固定步骤但菜品可以变化。


建造者模式的实现

C++ 实现

#include <iostream>
#include <string>
#include <memory>

// 产品类
class Product {
public:
   void AddPart(const std::string& part) {
       parts += part + " ";
   }
   void Show() const {
       std::cout << "Product built with parts: " << parts << std::endl;
   }
private:
   std::string parts;
};

// 抽象建造者
class Builder {
public:
   virtual ~Builder() = default;
   virtual void BuildPartA() = 0;
   virtual void BuildPartB() = 0;
   virtual std::unique_ptr<Product> GetResult() = 0;
};

// 具体建造者
class ConcreteBuilder : public Builder {
public:
   ConcreteBuilder() { product = std::make_unique<Product>(); }
   void BuildPartA() override {
       product->AddPart("PartA");
   }
   void BuildPartB() override {
       product->AddPart("PartB");
   }
   std::unique_ptr<Product> GetResult() override {
       return std::move(product);
   }
private:
   std::unique_ptr<Product> product;
};

// 指挥者
class Director {
public:
   void Construct(std::shared_ptr<Builder> builder) {
       builder->BuildPartA();
       builder->BuildPartB();
   }
};

// 客户端代码
int main() {
   std::shared_ptr<Builder> builder = std::make_shared<ConcreteBuilder>();
   Director director;
   director.Construct(builder);
   std::unique_ptr<Product> product = builder->GetResult();
   product->Show();
   return 0;
}


C# 实现

using System;

// 产品类
public class Product {
   private string parts = "";

   public void AddPart(string part) {
       parts += part + " ";
   }

   public void Show() {
       Console.WriteLine($"Product built with parts: {parts}");
   }
}

// 抽象建造者
public abstract class Builder {
   public abstract void BuildPartA();
   public abstract void BuildPartB();
   public abstract Product GetResult();
}

// 具体建造者
public class ConcreteBuilder : Builder {
   private Product product = new Product();

   public override void BuildPartA() {
       product.AddPart("PartA");
   }

   public override void BuildPartB() {
       product.AddPart("PartB");
   }

   public override Product GetResult() {
       return product;
   }
}

// 指挥者
public class Director {
   public void Construct(Builder builder) {
       builder.BuildPartA();
       builder.BuildPartB();
   }
}

// 客户端代码
class Program {
   static void Main(string[] args) {
       Builder builder = new ConcreteBuilder();
       Director director = new Director();
       director.Construct(builder);
       Product product = builder.GetResult();
       product.Show();
   }
}

建造者模式的类图


建造者模式的扩展

1. 多指挥者与多建造者结合

多个指挥者(Director)可复用建造者以创建不同风格的产品。

2. 与工厂模式结合

将建造者模式的产品创建交由工厂管理,建造者只专注于构造步骤。

3. 流式接口建造者

通过流式接口(Fluent Interface)简化使用,如 .BuildPartA().BuildPartB()


总结

建造者模式非常适合构造复杂对象,并使构建过程具有可扩展性和灵活性。它通过分离构建步骤和产品表示,解决了对象创建的复杂性问题。在实际开发中,建造者模式可以结合工厂模式和原型模式实现更复杂的功能,尤其是在配置生成、产品装配等场景中应用广泛。

相关文章
|
存储 Java 关系型数据库
JPA 注解及主键生成策略使用指南
JPA 注解及主键生成策略使用指南
972 0
|
6月前
|
人工智能 缓存 运维
【本不该故障系列】从 runC 到 runD:SAE 如何化解安全泄露风险
阿里云SAE默认采用runD安全容器,通过轻量虚拟化实现硬件级隔离,彻底解决runC共享内核导致的逃逸、噪声邻居、侧信道攻击等多租户安全风险。
|
5月前
|
测试技术 SEO
RAG不是把资料丢进向量库:检索质量闭环6步骤
企业智能体落地关键在RAG(检索增强生成)的实效性。本文直击常见痛点——答非所问、引用错误、口径失真,指出根源在于检索链路缺乏闭环。提出可运营的四步法:业务导向切分、混合召回(向量+关键词)、重排提效、强制引用溯源,并强调回归测试是质量保障核心。RAG不是建库,而是持续优化的搜索系统。(239字)
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】python之人工智能应用篇——视频生成技术
视频生成技术是一种基于深度学习和机器学习的先进技术,它使得计算机能够根据给定的文本、图像、视频等单模态或多模态数据,自动生成符合描述的、高保真的视频内容。这种技术主要依赖于深度学习模型,如生成对抗网络(GAN)、自回归模型(Auto-regressive Model)、扩散模型(Diffusion Model)等。其中,GAN由两个神经网络组成:一个生成器用于生成逼真的图像或视频,另一个判别器用于判断生成的图像或视频是否真实。通过不断的对抗学习,生成器和判别器共同优化,以产生更高质量的视频。
1021 2
|
数据采集 机器学习/深度学习 算法
利用Python进行数据预处理的实用指南
【9月更文挑战第15天】在探索数据科学之旅时,数据预处理是不可或缺的一环。本文将引导你通过Python实现数据清洗、转换和归一化等关键步骤,确保你的数据集为后续分析做好准备。我们将一起学习如何去除空值、异常值,以及如何标准化数据格式,从而让数据变得更加“乖巧”。让我们开始吧,将原始数据转化为洞察力量的旅程!
|
设计模式 网络协议 Java
技术笔记:Reactor设计模式
技术笔记:Reactor设计模式
446 0
|
缓存 关系型数据库 API
京东面试题:ElasticSearch深度分页解决方案!
京东面试题:ElasticSearch深度分页解决方案!
424 0
|
小程序
微信小程序APPID的两种查看方法
查看微信小程序APPID的两种方法:1) 在小程序内点击右上角“...”,进入查看页面,点击“更多资料”查看;2) 登录微信公众平台([https://mp.weixin.qq.com/](https://mp.weixin.qq.com/)),进入【设置】查看“账号信息”。
18031 1
|
JSON 算法 API
【python】python指南(十三):FastAPI鉴权Authorization方法
【python】python指南(十三):FastAPI鉴权Authorization方法
1332 0

热门文章

最新文章