生成器模式是一种在生成过程相同的情况下隐藏实现细节的创建型模式。
可以考虑这种场景,一个阅读器需要将一个文本转换为其他格式,转换的过程是相同的,比如先转换文字,再转换图片,段落,字体,染色等,最后组合在一起,得
到创建的结果。再比如房屋的建造,都是先选地盘,然后挖地基,运输材料,画图纸,然后盖楼,不同的楼会选择不同的地盘,挖不同深度的地基等,然后建成的房
屋也有不同的用途。
和抽象工厂模式不同,生成器模式是过程相同的,创建完之后直接返回一个创建好的对象,抽象工厂是先拿出来一个组件,然后选择用里面的哪些部件,最后拼凑起来。
书中例子的uml图如下所示(书中还有一个TextWigetConverter,这里省略了)
代码实现:
生成器模式,RTFReader
/********************************
* design pattern of GOF : Builder
* Author: shapherd
* data: 2010-11-19
* ******************************/
#include
#include
using namespace std;
/// product
class ASCIIText{
public:
ASCIIText(string showstring)
{
_showstring = showstring;
}
void show()
{
cout<<_showstring<<" has convert to ASCIIText"<
}
private:
string _showstring;
};
class TeXText{
public:
TeXText(string charstring, string fontstring)
{
_charstring = charstring;
_fontstring = fontstring;
}
void show()
{
cout<<_charstring<<" has convert to TeX chars" <
cout<<_fontstring<<" has convert to TeX font" <
cout<<"has convert to TeX paragraph" <
}
private:
string _charstring;
string _fontstring;
};
//Builder
class TextConverter {
public:
virtual void ConvertCharacter(string charstring){}
virtual void ConvertFontChange(string fontstring){}
virtual void ConvertParagraph(){}
virtual ~TextConverter() = 0;
};
TextConverter::~TextConverter(){}
//ConcreteBuilder
class ASCIIConverter : public TextConverter{
public:
void ConvertCharacter(string charstring)
{
_charstring = charstring;
}
ASCIIText* GetASCIIText()
{
return new ASCIIText(_charstring);
}
private:
string _charstring;
};
class TeXConverter : public TextConverter{
public:
void ConvertCharacter(string charstring)
{
_charstring = charstring;
}
void ConvertFontChange(string fontstring)
{
_fontstring = fontstring;
}
TeXText* GetTeXText()
{
return new TeXText(_charstring, _fontstring);
}
private:
string _charstring;
string _fontstring;
};
//Director
class RTFReader {
public:
RTFReader(TextConverter* ptc)
{
ptc->ConvertCharacter("hahahachar");
ptc->ConvertFontChange("hahahaFont");
ptc->ConvertParagraph();
}
};
//main
int main(int argc, char** argv)
{
ASCIIConverter* pac = new ASCIIConverter;
RTFReader ASCIIReader(pac);
ASCIIText* pat = pac->GetASCIIText();
pat->show();
delete pac;
delete pat;
TeXConverter* ptc = new TeXConverter;
RTFReader TeXReader(ptc);
TeXText* ptt = ptc->GetTeXText();
ptt->show();
delete ptc;
delete ptt;
return 0;
}
运行结果:
阅读(1949) | 评论(0) | 转发(0) |