首页 > 编程语言 >C++ 设计模式之建造者模式

C++ 设计模式之建造者模式

时间:2023-07-07 15:14:10浏览次数:33  
标签:Product Builder 建造 C++ ConcreteBuilder virtual str 设计模式 void

设计模式之建造者模式

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

其UML图如下:

  简单理解就是Builder中定义了创建Product各个部分的接口。ConcreteBuilder中具体实现了创建Product中的各个部分的接口,就是具体的建造者。Director是根据用户的需求构建Product的(具体怎么构建,怎么把Product中的各个部件构建起来。)该模式主要用于创建一些复杂的对象,这些兑现内部构建的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。

  说到这里建造者模式具体实现的功能与模板方法模式有点类似。比如可以有不同得ConcreteBuilder类实现不同得创建方式。这样从应用上模板方法模式和建造者模式实现的功能是很相似的。但是建造者模式的侧重点是在于Director的不同,可以有不同的呈现方式,而模板方法模式的侧重点是算法中每一步实现的不同。另外,它们的类之间的关系是不同的。模板方法是通过继承的方式来实现的,而建造者模式是通过组合的方式实现的。模板方法模式主要用于执行不同的算法,建造者模式主要用于构建对象。不过者两种模式其实都可以实现很多相似的功能。这也没什么,本来同样的功能的实现方式也是多种多样的。主要看需求。另外在实际写程序的时候也不必拘泥于某种设计模式,只要遵守相关的原则,使整个程序高效、稳定、易扩展、易维护就行。两者使用的场景也有区别。其示例代码如下:

  1 // BuilderModel.h文件
  2 #pragma once
  3 #include <iostream>
  4 #include <vector>
  5 #include <string>
  6 
  7 // 产品类
  8 class Product
  9 {
 10 public:
 11     void Add(std::string str)
 12     {
 13         m_vec.push_back(str);
 14     }
 15     void Show()
 16     {
 17         for (auto it = m_vec.cbegin(); it != m_vec.cend(); it++)
 18         {
 19             std::cout << *it << std::endl;
 20         }
 21     }
 22 private:
 23     std::vector<std::string> m_vec;
 24 };
 25 // 建造者类
 26 class Builder
 27 {
 28 public:
 29     virtual void BuildPartA() = 0;
 30     virtual void BuildPartB() = 0;
 31     virtual void BuildPartC() = 0;
 32     virtual Product getResult() = 0;
 33 };
 34 
 35 class ConcreteBuilder_0 : public Builder
 36 {
 37 public:
 38     ConcreteBuilder_0() : m_p(nullptr)
 39     {
 40         m_p = new Product();
 41     }
 42     virtual ~ConcreteBuilder_0()
 43     {
 44         if (nullptr == m_p)
 45             delete m_p;
 46     }
 47     virtual void BuildPartA()
 48     {
 49         std::string str = "Builder_0 BuildPartA";
 50         m_p->Add(str);
 51     }
 52     virtual void BuildPartB()
 53     {
 54         std::string str = "Builder_0 BuildPartB";
 55         m_p->Add(str);
 56     }
 57     virtual void BuildPartC()
 58     {
 59         std::string str = "Builder_0 BuildPartC";
 60         m_p->Add(str);
 61     }
 62     Product getResult()
 63     {
 64         return *m_p;
 65     }
 66 private:
 67     Product * m_p;
 68 };
 69 
 70 class ConcreteBuilder_1 : public Builder
 71 {
 72 public:
 73     ConcreteBuilder_1() : m_p(nullptr)
 74     {
 75         m_p = new Product();
 76     }
 77     virtual ~ConcreteBuilder_1()
 78     {
 79         if (nullptr == m_p)
 80             delete m_p;
 81     }
 82     virtual void BuildPartA()
 83     {
 84         std::string str = "Builder_1 BuildPartA";
 85         m_p->Add(str);
 86     }
 87     virtual void BuildPartB()
 88     {
 89         std::string str = "Builder_1 BuildPartB";
 90         m_p->Add(str);
 91     }
 92     virtual void BuildPartC()
 93     {
 94         std::string str = "Builder_1 BuildPartC";
 95         m_p->Add(str);
 96     }
 97     Product getResult()
 98     {
 99         return *m_p;
100     }
101 private:
102     Product * m_p;
103 };
104 // 指挥者类
105 class Director
106 {
107 public:
108     // 具体怎么实现根据需求
109     void build(Builder *p)
110     {
111         p->BuildPartA();
112         p->BuildPartC();
113         p->BuildPartB();
114     }
115 };

测试代码如下:

 1 #include <iostream>
 2 #include "BuilderModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     // 建造者模式
 8     Builder *builder= new ConcreteBuilder_0();
 9     Director * director = new Director();
10     director->build(builder);
11     builder->getResult().Show();
12 
13     delete builder;
14     builder = new ConcreteBuilder_1();
15     director->build(builder);
16     builder->getResult().Show();
17     getchar();
18     return 0;
19 }

测试结果如下图:

 

标签:Product,Builder,建造,C++,ConcreteBuilder,virtual,str,设计模式,void
From: https://www.cnblogs.com/ybqjymy/p/17535002.html

相关文章

  • C++设计模式之观察者模式
    设计模式之观察者模式观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。其UML图如下: 在ConcretSubject内部有一个Observer的列表,当Subject的状态发生改变时,会通知列表内......
  • C++ 设计模式之抽象工厂模式
    设计模式之抽象工厂模式抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。其UML图如下: 结合上图我们来理解一下抽象工厂模式的定义。提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类。在上图中一系列相互依赖或相关......
  • C++ 设计模式之模板方法模式
    设计模式之模板方法模式模板方法模式,定义一个操作中的算法的股价,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。说白了就是有一个算法有很多部分,这个算法在基类中已经定义好了。而算法中的各个部分都写成各个成员函......
  • JAVA设计模式之模板模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......
  • C++ 设计模式之备忘录模式
    设计模式之备忘录模式备忘录,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式很好理解,其UML图如下:在Originator中提供了创建Memento的接口,具体要保存什么样的内容,则根据需求来定。而Caretake......
  • C++ 设计模式之责任链模式
    设计模式之责任链模式责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。该模式很好理解,其UML图如下: 每个ConcreteHandler都有一定的请求处理能力,当自己处理不了的时......
  • C++ 设计模式之中介者模式
    设计模式之中介者模式中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。该模式很好理解,其UML图如下: Mediator中每个交互者的引用,在Mediator内部封装了各种类之间的交互。至于那个类......
  • C++ 设计模式之享元模式
    设计模式之享元模式享元模式,运用共享技术有效地支持大量细粒度的对象。面向对象技术可以很好地解决一些灵活性或扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正式为了解决这依赖问题而诞生的。......
  • C++ 设计模式之解释器模式
    设计模式之解释器模式解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建......
  • C/C++数据结构与算法课程设计[2023-07-06]
    C/C++数据结构与算法课程设计[2023-07-06]数据结构与算法课程设计一、课程设计的目的、要求和任务 本课程设计是为了配合《数据结构与算法》课程的开设,通过设计完整的程序,使学生掌握数据结构的应用、算法的编写等基本方法。1.课程的目的(1)使学生进一步理解和掌握课堂上所学......