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 

运行结果:

运行结果


目录
相关文章
|
4月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
41 3
|
4月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
45 2
|
6月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
59 2
|
6月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
204 1
|
6月前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
14天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
19 4
|
14天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
16 4
|
14天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
14 1
|
24天前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
24天前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)

热门文章

最新文章