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 
AI 代码解读

运行结果:

运行结果


目录
打赏
0
0
0
0
5
分享
相关文章
「全网最细 + 实战源码案例」设计模式——生成器模式
生成器模式(Builder Pattern)是一种创建型设计模式,用于分步骤构建复杂对象。它允许用户通过控制对象构造的过程,定制对象的组成部分,而无需直接实例化细节。该模式特别适合构建具有多种配置的复杂对象。其结构包括抽象建造者、具体建造者、指挥者和产品角色。适用于需要创建复杂对象且对象由多个部分组成、构造过程需对外隐藏或分离表示与构造的场景。优点在于更好的控制、代码复用和解耦性;缺点是增加复杂性和不适合简单对象。实现时需定义建造者接口、具体建造者类、指挥者类及产品类。链式调用是常见应用方式之一。
100 12
|
12月前
|
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
95 3
|
12月前
|
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
159 2
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决
iLogtail设计模式问题之生成器模式的Product(产品)角色是什么
iLogtail设计模式问题之生成器模式的Product(产品)角色是什么
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
84 16
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
59 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等