Skip to content
This repository was archived by the owner on Jan 13, 2021. It is now read-only.

Latest commit

ย 

History

History

Builder

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 

README.md

๋นŒ๋”ํŒจํ„ด


๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์กฐ๋ฆฝ ๋ฐฉ๋ฒ•์„ ๋ถ„๋ฆฌํ•œ๋‹ค.

  • ์—ฌ๊ธฐ์„œ ๊ฐ์ฒด๋ž€ ์•„๋ž˜์˜ ์ฐธ์—ฌ์ž ์ค‘ ํ•˜๋‚˜์ธ 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)์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.