๊ฐ์ฒด์ ์์ฑ๊ณผ ์กฐ๋ฆฝ ๋ฐฉ๋ฒ์ ๋ถ๋ฆฌํ๋ค.
- ์ฌ๊ธฐ์ ๊ฐ์ฒด๋ ์๋์ ์ฐธ์ฌ์ ์ค ํ๋์ธ Product๋ฅผ ์ผ์ปซ๋๋ค.
- ์์ฑ์ Builder๊ฐ ๋ด๋นํ๋ค. (Product์ ๊ฐ ๋ถํ ์์ฑ)
- ์กฐ๋ฆฝ ๋ฐฉ๋ฒ ์ ์๋ Builder๋ฅผ ์ด์ฉํ Director์ ์ง์๋ก ๋ณผ ์ ์๋ค.
๋น๋ํจํด์ ์ฐธ์ฌ์๋ก๋
- Director : Builder๊ฐ ๋ง๋ ๋ถํ์ ์กฐํฉํด Product๋ฅผ ๋ง๋๋ ์ญํ (์์ฑ์ ์ฑ ์์ Builder์ ์์)
- Builder : Builder ์ธํฐํ์ด์ค
- ConcreteBuilder : Builder ์ธํฐํ์ด์ค ๊ตฌํ์ฒด
- Product : Director๊ฐ Builder๊ฐ ๋ง๋ ๋ถํ์ ์กฐํฉํด ๋ง๋ ๊ฒฐ๊ณผ๋ฌผ
๊ฐ ์๋ค.
RTFReader(Director)๋ RTF ๋ฌธ์๋ฅผ ํ๋
ํ ํ(parse) ๋ฌธ์ ๋ณํ(convert)์ ๊ฑฐ์ณ ASCIIText(Product)๋ฅผ ์ป๊ณ ์ถ๋ค. ๋น๋ํจํด์ ์ด์ฉํ๋ฉด,
- RTFReader๋ด๋ถ์์ RTF ๋ฌธ์์ parse ์์ ์ด ์ด๋ฃจ์ด์ง๋ค.
- parse๋ ์์ ๋ฌผ์ RTFReader์ ์ง์์ ๋ฐ๋ผ Builder๊ฐ ๋ณํํ๋ ์์ ์ ํ๋ค.
- ASCIIText๊ฐ ๋ง๋ค์ด์ง๋ค.
// CreateText ๋ฉ์๋์๋ Director์ธ RTFReader๊ฐ Builder์๊ฒ ํ ์ง์๊ฐ ์ ์๋์ด ์๋ค.
Text* RTFReader::CreateText(Converter builder){
builder.BuildText(); // ๋จผ์ ์๋ฌด๊ฒ๋ ๊ฐ๋ฏธ๋์ง ์์ original Text๋ฅผ ์์ฑ.
builder.BuildFont();
builder.BuildPartA();
builder.BuildPartB();
// Director๋ ํ์ํ ์์๋ฅผ ๋ง๋ค์ด ๋ฌ๋ผ๊ณ ๊ณ์ builder์ ์์ฒญํ๋ค.
return builder.GetText();
};ASCIIConverter๋ Builder ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ConcreteBuilder์ด๋ค. Builder ์ธํฐํ์ด์ค๋ Product์ ์์ฑ ๊ณผ์ ์ ๋ฐ์ํ๋ค. ์๋๋ ASCIIConverter์ ๋ชจ์ฒด์ธ Converter๋ผ๋ Builder ์ธํฐํ์ด์ค์ด๋ค. C++๋ก ๊ตฌํํ ๋๋ Builder ์ธํฐํ์ด์ค์ ์ ์๋ ๋ฉ์๋๋ฅผ ์๋์ ์ผ๋ก ๊ฐ์ ํจ์๋ก ์ ์ํ๋ ๋์ , ๊ตฌํ๋ถ๋ฅผ ๋น์๋๋ ๊ฒ์ด ๋ ๋ฐ๋์งํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด Builder์ ์๋ธํด๋์ค์์ Builder์ ์ ์๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ ํ์์์ด, ํ์ํ ๋ฉ์๋๋ง ์ฌ์ ์ํ ์ ์๊ฒ ๋๋ค.
class Converter {
public:
virtual void BuildText(){}
virtual void BuildFont(){} // Product์ ํ์ํ ๋ถํ์ ์์ฑํ๋ค.
virtual void BuildPartA(){}
virtual void BuildPartB(){}
virtual Text* GetText(){ return 0; }
protected:
Converter();
};ASCIIConverter๋ ์ด๋ฅผ implementsํ๋ค.
class ASCIIConverter : public Converter {
public:
ASCIIConverter();
virtual void BuildText();
virtual void BuildFont();
virtual void BuildPartA();
virtual void BuildPartB();
virtual Text* GetText();
private:
Text* _currentText;
};BuildText()๋ก Text์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ _currentText๋ก ์ธํ
ํ๊ณ , ๋ค๋ฅธ ์ฐ์ฐ์ ํตํด ๋ถํ๋ค์ ์์ฑ ๋ฐ ๋ณตํฉํ ํ GetText()๋ก ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋๋ ค์ค๋ค.
ASCIIConverter::ASCIIConverter(){
_currentText = 0;
}
void ASCIIConverter::BuildText(){
_currentText = new Text;
}
void ASCIIConverter::GetText(){
return _currentText;
}๋ํ, RTFReader(Director)๋ ASCIIText์ธ์ ๋ค๋ฅธ ์ข
๋ฅ์ ๋ณํ๋ Text๋ฅผ ์ป๊ณ ์ถ์ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด HTML ํฌ๋งท์ Text๋ฅผ ์ป๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ด ๋๋ Converter(Builder) ์ธํฐํ์ด์ค๋ฅผ ์์ํ์ฌ HTMLConverter๋ผ๋ ConcreteBuilder๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค. HTMLConverter๋ฅผ RTFReader::CreateText(Converter builder)๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ๋๊ธฐ๊ณ RTFReader์์ HTMLText(Product)์ ๊ตฌํ ๋ฐฉ๋ฒ์ builder์ ์ง์ํ์ฌ, HTMLText์ ์์ฑ์ ์์ฑํ ์ ์๋ค.
์ฌ์ฉ์๋ ์ต์ข ์ ์ผ๋ก Director์ ConcreteBuilder๋ฅผ ์๋์ ๊ฐ์ด ์ด์ฉํ ์ ์๋ค.
Text* asciiText;
Text* htmlText;
RTFReader reader;
ASCIIConverter asciiConverter;
HTMLConverter htmlConverter;
asciiText = reader.CreateText(asciiConverter);
htmlText = reader.CreateText(htmlConverter);Director๋ Director ๋ด๋ถ์์ ์ ์ํ ๋ฉ์๋์ Builder์ ์๋ธ ํด๋์ค๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ, ์ ํ์ ๋ํ ๋ด๋ถ ํํ์ ํตํด ์ต์ข ์ ํ์ ์ฐ์ถ๋ฌผ์ ์ป์ด๋ผ ์ ์๋ค. ์ด ๋ ์ ํ ๋ด๋ถ ํํ์ Director๊ฐ ๊ด์ฅํ๋ฉฐ, ์ ํ ์์ฑ ๋ฐ ๋ถํ ์ถ๊ฐ๋ Builder์ ์์ํ๋ค.
- ์ ํ์ ๋ด๋ถ ํํ์ ๋ค์ํ๊ฒ ํ ์ ์๋ค.
- ์ ํ์ ํํ(Director)๊ณผ ์์ฑ(Builder)์ ๋ถ๋ฆฌํ ์ ์๋ค.