gof设计模式——生成器c++实现

简介:

  生成器模式是一种在生成过程相同的情况下隐藏实现细节的创建型模式。

 

       可以考虑这种场景,一个阅读器需要将一个文本转换为其他格式,转换的过程是相同的,比如先转换文字,再转换图片,段落,字体,染色等,最后组合在一起,得到创建的结果。再比如房屋的建造,都是先选地盘,然后挖地基,运输材料,画图纸,然后盖楼,不同的楼会选择不同的地盘,挖不同深度的地基等,然后建成的房屋也有不同的用途。

 

       和抽象工厂模式不同,生成器模式是过程相同的,创建完之后直接返回一个创建好的对象,抽象工厂是先拿出来一个组件,然后选择用里面的哪些部件,最后拼凑起来。

 

      书中例子的uml图如下所示(书中还有一个TextWigetConverter,这里省略了)

 

生成器模式

 

 

代码实现:

 1 /********************************
  2  * design pattern of GOF : Builder
  3  * Author: shapherd
  4  * data: 2010-11-19
  5  * ******************************/
  6 #include<iostream>
  7 #include<string>
  8  using namespace std;
  9 
 10  /// product
 11  class ASCIIText{
 12     public:
 13         ASCIIText(string showstring)
 14         {
 15             _showstring = showstring;
 16         }
 17         void show()
 18         {
 19             cout<<_showstring<<" has convert to ASCIIText"<<endl;
 20         }
 21     private:
 22         string _showstring;
 23 };
 24  class TeXText{
 25     public:
 26         TeXText(string charstring, string fontstring)
 27         {
 28             _charstring = charstring;
 29             _fontstring = fontstring;
 30         }
 31         void show()
 32         {
 33             cout<<_charstring<<" has convert to TeX chars" <<endl;
 34             cout<<_fontstring<<" has convert to TeX font" <<endl;
 35             cout<<"has convert to TeX paragraph" <<endl;
 36         }
 37     private:
 38         string _charstring;
 39         string _fontstring;
 40 };
 41 
 42  //Builder 
 43  class TextConverter {
 44     public:
 45         virtual void ConvertCharacter(string charstring){}
 46         virtual void ConvertFontChange(string fontstring){}
 47         virtual void ConvertParagraph(){}
 48         virtual ~TextConverter() = 0;
 49 };
 50 TextConverter::~TextConverter(){}
 51  //ConcreteBuilder
 52  class ASCIIConverter : public TextConverter{
 53     public:
 54         void ConvertCharacter(string charstring)
 55         {
 56             _charstring = charstring;
 57         }
 58         ASCIIText* GetASCIIText()
 59         {
 60             return new ASCIIText(_charstring);
 61         }
 62     private:
 63         string _charstring;
 64 };
 65 class TeXConverter : public TextConverter{
 66     public:
 67         void ConvertCharacter(string charstring)
 68         {
 69             _charstring = charstring;
 70         }
 71         void ConvertFontChange(string fontstring)
 72         {
 73             _fontstring = fontstring;
 74         }
 75         TeXText* GetTeXText()
 76         {
 77             return new TeXText(_charstring, _fontstring);
 78         }
 79     private:
 80         string _charstring;
 81         string _fontstring;
 82 };
 83 
 84 //Director
 85 class RTFReader {
 86     public:
 87         RTFReader(TextConverter* ptc)
 88         {
 89             ptc->ConvertCharacter("hahahachar");
 90             ptc->ConvertFontChange("hahahaFont");
 91             ptc->ConvertParagraph();
 92         }
 93 };
 94 
 95 //main
 96 int main(int argc, char** argv)
 97 {
 98     ASCIIConverter* pac = new ASCIIConverter;
 99     RTFReader ASCIIReader(pac);
100     ASCIIText* pat = pac->GetASCIIText();
101     pat->show();
102     delete pac;
103     delete pat;
104 
105     TeXConverter* ptc = new TeXConverter;
106     RTFReader TeXReader(ptc);
107     TeXText* ptt = ptc->GetTeXText();
108     ptt->show();
109     delete ptc;
110     delete ptt;
111     
112     return 0;
113 }
114 

运行结果:

运行结果


目录
相关文章
|
2月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
34 3
|
2月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
32 2
|
4月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
46 2
|
4月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
169 1
|
4月前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
29天前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
30 0
|
29天前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数
|
8天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
8天前
|
C++
C++(十六)类之间转化
在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。
|
8天前
|
存储 设计模式 编译器
C++(十三) 类的扩展
本文详细介绍了C++中类的各种扩展特性,包括类成员存储、`sizeof`操作符的应用、类成员函数的存储方式及其背后的`this`指针机制。此外,还探讨了`const`修饰符在成员变量和函数中的作用,以及如何通过`static`关键字实现类中的资源共享。文章还介绍了单例模式的设计思路,并讨论了指向类成员(数据成员和函数成员)的指针的使用方法。最后,还讲解了指向静态成员的指针的相关概念和应用示例。通过这些内容,帮助读者更好地理解和掌握C++面向对象编程的核心概念和技术细节。