大话设计模式C++版本-09-建造者模式

简介: 大话设计模式C++版本-09-建造者模式

概述

建造者模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

建造者模式其实就是在创建复杂对象时,使用一个Builder类(建造者类)来规范了必要的步骤,并且使用一个Director类(指挥类)来规范建造过程


应用场景

一些基本部件不会变,而其组合经常变化的时候。例如:画一个小人,小人的基本部件(头、身体、两只手、两只脚)以及画的过程一般都不会变的;而画瘦子或胖子就需要改变画的方法了。


一般步骤

1.写一个Builder类规范必要的步骤,每个步骤都是纯虚函数,所以子类必须重写,没有重写则编译不过,所以每个必要的步骤都实现了,不会漏掉哪个步骤;

 // 建造者类-规范了必要的步骤,因为都是纯虚函数,所以子类必须重写,否则编译不过
class Builder
{
public:
  virtual void BuildPartA() = 0;
  virtual void BuildPartB() = 0;
  virtual Product *GetResult() = 0;
};

2.写子类,继承Builder类,并实现必要的步骤

class ConcreatBuilder1 : public Builder
{
private:
  Product *product;
public:
  ConcreatBuilder1()
  {
    product = new Product();
  }
  ~ConcreatBuilder1()
  {
    delete product;
  }
  void BuildPartA()
  {
    product->Add("部件A");
  }
  void BuildPartB()
  {
    product->Add("部件B");
  }
  Product *GetResult()
  {
    return product;
  }
};
class ConcreatBuilder2 : public Builder
{
private:
  Product *product;
public:
  ConcreatBuilder2()
  {
    product = new Product();
  }
  ~ConcreatBuilder2()
  {
    delete product;
  }
  void BuildPartA()
  {
    product->Add("部件X");
  }
  void BuildPartB()
  {
    product->Add("部件Y");
  }
  Product *GetResult()
  {
    return product;
  }
};

3.写一个Director类规范建造过程,这个类就是规定了Builder类的步骤哪个是第一步、第二步、第三步 …

class Director // 指挥类-控制建造过程。
{
public:
  void Construct(Builder *builder)
  {
    builder->BuildPartA();
    builder->BuildPartB();
  }
};

具体实例完整代码

#include <iostream>
#include <list>
#include <string>
using namespace std;
class Product
{
private:
  list<string> parts;
public:
  void Add(string part)
  {
    parts.push_back(part);
  }
  void Show()
  {
    for (list<string>::iterator it=parts.begin();
       it!=parts.end(); ++it)
    {
      cout << *it << endl;
    }
  }
};
// 建造者类-规范了必要的步骤,因为都是纯虚函数,所以子类必须重写,否则编译不过
class Builder 
{
public:
  virtual void BuildPartA() = 0;
  virtual void BuildPartB() = 0;
  virtual Product *GetResult() = 0;
};
class ConcreatBuilder1 : public Builder
{
private:
  Product *product;
public:
  ConcreatBuilder1()
  {
    product = new Product();
  }
  ~ConcreatBuilder1()
  {
    delete product;
  }
  void BuildPartA()
  {
    product->Add("部件A");
  }
  void BuildPartB()
  {
    product->Add("部件B");
  }
  Product *GetResult()
  {
    return product;
  }
};
class ConcreatBuilder2 : public Builder
{
private:
  Product *product;
public:
  ConcreatBuilder2()
  {
    product = new Product();
  }
  ~ConcreatBuilder2()
  {
    delete product;
  }
  void BuildPartA()
  {
    product->Add("部件X");
  }
  void BuildPartB()
  {
    product->Add("部件Y");
  }
  Product *GetResult()
  {
    return product;
  }
};
class Director // 指挥类-控制建造过程。
{
public:
  void Construct(Builder *builder)
  {
    builder->BuildPartA();
    builder->BuildPartB();
  }
};
int main()
{
  Director *director = new Director();
  Builder *builder1 = new ConcreatBuilder1();
  Builder *builder2 = new ConcreatBuilder2();
  director->Construct(builder1);
  Product *product1 = builder1->GetResult();
  product1->Show();
  director->Construct(builder2);
  Product *product2 = builder2->GetResult();
  product2->Show();
  return 0;
}

参考资料

程杰老师的《大话设计模式》

如果对你有帮助的话,记得点赞收藏,如果有什么遗漏的或者有什么体会,请在评论告诉我,好东西记得分享 ^ _ ^

目录
相关文章
|
10天前
|
设计模式 Java
【设计模式系列笔记】建造者模式
建造者模式是一种创建型设计模式,用于将复杂对象的构建与其表示分离,使构建过程可定制。关键元素包括产品类(定义要构建的对象)、建造者接口(定义构建方法)、具体建造者类(实现构建过程)和指导者类(负责构建过程)。通过建造者模式,客户端可以灵活地创建具有不同表示的复杂对象,提高代码的可读性和可维护性,尤其适用于构建过程复杂且包含多个可选部分的情况。
104 1
|
2月前
|
C++
二叉树进阶面试题(精华总结)【C++版本】
二叉树进阶面试题(精华总结)【C++版本】
|
2月前
|
设计模式 编译器 API
【C/C++ Pimpl模式】隐藏实现细节的高效方式 (Pimpl Idiom: An Efficient Way to Hide Implementation Details)
【C/C++ Pimpl模式】隐藏实现细节的高效方式 (Pimpl Idiom: An Efficient Way to Hide Implementation Details)
67 1
|
2月前
|
设计模式 中间件 程序员
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
20 3
|
7天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
19天前
|
设计模式 Java
小谈设计模式(14)—建造者模式
小谈设计模式(14)—建造者模式
|
23天前
|
人工智能 机器人 Linux
【C++】Linux下如何查看opencv的版本
【C++】Linux下如何查看opencv的版本
|
29天前
|
XML JSON JavaScript
推荐一个比较好用的c++版本http协议库-cpp-httplib
推荐一个比较好用的c++版本http协议库-cpp-httplib
44 1
|
29天前
|
JSON Linux API
一个C++版本的Sqlite3封装--SmartDb
一个C++版本的Sqlite3封装--SmartDb
14 0
|
2月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
122 1