建造者设计模式学习

打印 上一主题 下一主题

主题 854|帖子 854|积分 2562

1.介绍

建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程与它的表现分离,使得相同的构建过程可以创建差别的表现。通过分步骤地构建对象,建造者模式提供了更细粒度的控制和灵活性,特别适合需要灵活创建复杂对象的场景。


  • Builder(建造者接口):界说创建对象差别部分的抽象接口。
  • ConcreteBuilder(详细建造者):实现 Builder 接口,负责构建复杂对象的各个部分,并终极返回完备对象
  • Director(指挥者):指定复杂对象的构建顺序和步骤,协调 Builder 的调用。【指挥者可以大略】
  • Product(产品):由多个部件构成的复杂对象,是建造的终极结果。
2.简朴例子

标准的例子:
  1. #include <iostream>
  2. #include <string>
  3. // Product: 复杂对象
  4. class Computer {
  5. private:
  6.     std::string CPU;
  7.     std::string GPU;
  8.     std::string RAM;
  9.     std::string Storage;
  10. public:
  11.     void setCPU(const std::string& cpu) { CPU = cpu; }
  12.     void setGPU(const std::string& gpu) { GPU = gpu; }
  13.     void setRAM(const std::string& ram) { RAM = ram; }
  14.     void setStorage(const std::string& storage) { Storage = storage; }
  15.     void show() const {
  16.         std::cout << "Computer Configuration:\n"
  17.                   << "CPU: " << CPU << "\n"
  18.                   << "GPU: " << GPU << "\n"
  19.                   << "RAM: " << RAM << "\n"
  20.                   << "Storage: " << Storage << "\n";
  21.     }
  22. };
  23. // Builder: 抽象建造者
  24. class ComputerBuilder {
  25. public:
  26.     virtual ~ComputerBuilder() = default;
  27.     virtual void buildCPU() = 0;
  28.     virtual void buildGPU() = 0;
  29.     virtual void buildRAM() = 0;
  30.     virtual void buildStorage() = 0;
  31.     virtual Computer* getResult() = 0;
  32. };
  33. // ConcreteBuilder: 具体建造者
  34. class GamingComputerBuilder : public ComputerBuilder {
  35. private:
  36.     Computer* computer;
  37. public:
  38.     GamingComputerBuilder() { computer = new Computer(); }
  39.     ~GamingComputerBuilder() { delete computer; }
  40.     void buildCPU() override { computer->setCPU("Intel i9"); }
  41.     void buildGPU() override { computer->setGPU("NVIDIA RTX 4090"); }
  42.     void buildRAM() override { computer->setRAM("32GB DDR5"); }
  43.     void buildStorage() override { computer->setStorage("2TB SSD"); }
  44.     Computer* getResult() override {
  45.         Computer* result = computer;
  46.         computer = nullptr; // 防止重复释放
  47.         return result;
  48.     }
  49. };
  50. // Director: 指挥者
  51. class Director {
  52. private:
  53.     ComputerBuilder* builder;
  54. public:
  55.     void setBuilder(ComputerBuilder* b) { builder = b; }
  56.     Computer* construct() {
  57.         builder->buildCPU();
  58.         builder->buildGPU();
  59.         builder->buildRAM();
  60.         builder->buildStorage();
  61.         return builder->getResult();
  62.     }
  63. };
  64. // 客户端代码
  65. int main() {
  66.     Director director;
  67.     GamingComputerBuilder gamingBuilder;
  68.     // 设置建造者
  69.     director.setBuilder(&gamingBuilder);
  70.     // 构建计算机
  71.     Computer* gamingComputer = director.construct();
  72.     // 显示结果
  73.     gamingComputer->show();
  74.     delete gamingComputer;
  75.     return 0;
  76. }
复制代码
// 其实director有点死板,它每次都要使用差别的builder,才气创建差别的对象,直接把创建产品的使命交给builder自己也行。
2.1 链式编程

https://zhuanlan.zhihu.com/p/143101326
关键点是builder的函数直接返回产品对象
  1. // 产品类
  2. public class KFC {
  3.     //套餐必点
  4.     private String hamburger;
  5.     private String chips;
  6.     //套餐选点
  7.     private String chicken;
  8.     private String cola;
  9.     private String pizza;
  10.     public KFC(String hamburger,String chips){
  11.         this.hamburger = hamburger;
  12.         this.hamburger = chips;
  13.     }
  14.     public void setChicken(String chicken) {
  15.         this.chicken = chicken;
  16.     }
  17.     public void setCola(String cola) {
  18.         this.cola = cola;
  19.     }
  20.     public void setPizza(String pizza) {
  21.         this.pizza = pizza;
  22.     }
  23. };
  24. // 抽象builder
  25. public abstract class Builder {
  26.         abstract Builder setChicken();
  27.         abstract Builder setCola();
  28.         abstract Builder setPizza();
  29.         abstract KFC getKFC();
  30. }
  31. // 具体builder
  32. public class ConcreteBuilder extends Builder {
  33.     KFC kfc;
  34.     public ConcreteBuilder(String hamburger,String chips){
  35.         kfc = new KFC(hamburger,chips);
  36.     }
  37.     @Override
  38.     Builder setChicken() {
  39.         kfc.setChicken("鸡腿");
  40.         return this; // 返回自己,可以链式调用
  41.     }
  42.     @Override
  43.     Builder setCola() {
  44.         kfc.setCola("可乐");
  45.         return this;
  46.     }
  47.     @Override
  48.     Builder setPizza() {
  49.         kfc.setPizza("披萨");
  50.         return this;
  51.     }
  52.     @Override
  53.     KFC getKFC() {
  54.         return kfc;
  55.     }
  56. }
  57. // main函数
  58. public class BTest {
  59.     public static void main(String[] args) {
  60.                 // 实例化一个具体的builder类,通过它返回一个具体对象
  61.        KFC kfc = new ConcreteBuilder("汉堡","薯条").setChicken().setCola().getKFC();
  62.     }
  63. }
复制代码


3.项目实例

gRPC通过builder构建server对象,

这里的builder也不是一个抽象建造者,而是一个详细的类,所以它是只有详细建造者和产品类,也可以明确为将director和builder合二为一了,都合到builder里面了。设计模式是可以简化的,不是那么死板的。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表