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 

运行结果:

运行结果


目录
相关文章
|
23天前
|
设计模式 Java
「全网最细 + 实战源码案例」设计模式——生成器模式
生成器模式(Builder Pattern)是一种创建型设计模式,用于分步骤构建复杂对象。它允许用户通过控制对象构造的过程,定制对象的组成部分,而无需直接实例化细节。该模式特别适合构建具有多种配置的复杂对象。其结构包括抽象建造者、具体建造者、指挥者和产品角色。适用于需要创建复杂对象且对象由多个部分组成、构造过程需对外隐藏或分离表示与构造的场景。优点在于更好的控制、代码复用和解耦性;缺点是增加复杂性和不适合简单对象。实现时需定义建造者接口、具体建造者类、指挥者类及产品类。链式调用是常见应用方式之一。
51 12
|
7月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
62 3
|
6月前
|
设计模式 项目管理
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决
|
7月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
90 2
|
7月前
|
C++ 设计模式
iLogtail设计模式问题之生成器模式的Product(产品)角色是什么
iLogtail设计模式问题之生成器模式的Product(产品)角色是什么
|
9月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
93 2
|
8月前
|
设计模式 算法 索引
程序技术好文:设计模式之美:Builder(生成器)
程序技术好文:设计模式之美:Builder(生成器)
|
9月前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
2月前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
142 11
|
3月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式