GoF์˜ ๋””์ž์ธ ํŒจํ„ด, ๋‘๋ฒˆ์งธ ๋นŒ๋” ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

ํ•ด๋‹น ๊ธ€์€, ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ

๋ณต์žกํ•œ ๊ตฌ์„ฑ์˜ ๊ฐ์ฒด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํŒจํ„ด

  • ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ์— ์ž์ฃผ ์‚ฌ์šฉ๋จ
    1. ์ƒ์„ฑ์‹œ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ์ธ์ž๊ฐ€ ๋งŽ์„ ๋•Œ
    2. ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ์—ฌ๋Ÿฌ๋‹จ๊ณ„๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฑฐ์น  ๋•Œ
      • ๋‹จ๊ณ„์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ด๋‘๊ณ  ๊ฐ ๋‹จ๊ณ„๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
  • ์ด ๊ธ€์—์„œ๋Š” ๋‘๋ฒˆ์งธ ๊ฒฝ์šฐ๋ฅผ ์ฃผ๋กœ ์„ค๋ช…ํ•จ

์˜ˆ์‹œ

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์—ฌ๋Ÿฌ ํฌ๋งท์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.
  • Director๋Š” Builder๋ฅผ ๋ฐ›์•„ ๋งž๋Š” ํฌ๋งท์˜ ์ˆœ์„œ๋กœ ์กฐ์ž‘ํ•œ ๋’ค ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.
internal func main() {
    
    // Plain
    var data = Data(name: "wansik", age: 28)
    var builder: Builder = PlainTextBuilder(data: data)
    var director = Director(builder: builder)
    
    var result = director.build()
    print(result)
    
    // JSON
    data = Data(name: "wansik", age: 28)
    builder = JSONBuilder(data: data)
    director = Director(builder: builder)
    
    result = director.build()
    print(result)
    
    // XML
    data = Data(name: "wansik", age: 28)
    builder = XMLBuilder(data: data)
    director = Director(builder: builder)
    
    result = director.build()
    print(result)
}
  • ๋งŒ๋“ค์–ด์ง„ Builder๋Š” Data๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • Builder class๋ฅผ ์‚ฌ์šฉํ•˜๋Š” class๋ผ๋ฉด ๋ชจ๋‘ Director๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Builder ํŒจํ„ด์€ Template, Facade, Strategy ํŒจํ„ด์„ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๊ณผ์ •์— ์ ์šฉํ–ˆ๋‹ค๊ณ ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • Director๋Š” Builder๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” method๋“ค์˜ ์‚ฌ์šฉ์„ ๋‹จ์ˆœํ™” ์‹œ์ผœ์ฃผ๊ณ  ์žˆ๋‹ค. (Facade)
  • Builder๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ํ˜ธ์ถœ๋˜๋Š” method๋ฅผ interface๋กœ ์„ ์–ธํ•˜๊ณ , ๊ตฌํ˜„์€ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ํ•œ ๋’ค, method๋“ค์˜ ํ˜ธ์ถœ ๋ฐฉ์‹์„ Director์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ (Template ์‘์šฉ)
  • ์›ํ•˜๋Š” ์ƒํ™ฉ์— ๋งž๋Š” ํ˜•์‹์— ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ (Strategy)
    • ์‚ฌ์‹ค ๋‹จ์ˆœํ•˜๊ณ , OOP์˜ ๊ธฐ๋ณธ ์›์น™์„ ์ ์šฉํ•˜๋ฉด ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์ข…์ข… ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ™œ์šฉ์„ฑ

  • ๊ฐ์ฒด ์ƒ์„ฑ์— ์žˆ์–ด ์ธ์ž๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ
  • ๊ฐ์ฒด์˜ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹ฌ๋ผ์งˆ ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ

์ฐธ์—ฌ์ž

  • Builder(Builder): Product ๊ฐ์ฒด์˜ ์ผ๋ถ€ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜
  • ConcreteBuilder(PlainTextBuilderโ€ฆ): Builder ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ๋ถ€ํ’ˆ์„ ๋ชจ์•„ ์ œํ’ˆ์„ ์กฐ๋ฆฝํ•จ
  • Director(Director): Builder ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์ œํ’ˆ์„ ํ•ฉ์„ฑํ•จ
  • Product(String): ์ƒ์„ฑํ•  ๋ณตํ•ฉ ๊ฐ์ฒด

ํ˜‘๋ ฅ ๋ฐฉ๋ฒ•

  • Client๋Š” Director ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Builder๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ํ•ฉ์„ฑํ•œ๋‹ค.
  • ์ œํ’ˆ์˜ ์ผ๋ถ€๊ฐ€ ๊ตฌ์ถ•๋  ๋•Œ๋งˆ๋‹ค Director๋Š” Builder์— ์•Œ๋ฆฐ๋‹ค.
  • Builder๋Š” Director์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ œํ’ˆ์— ๋ถ€ํ’ˆ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • Director๋Š” Builder์—์„œ ์ œํ’ˆ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.(๋ฆฌํ„ด ๋ฐ›๋Š”๋‹ค.)

๊ฒฐ๊ณผ

  1. ์ œํ’ˆ์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ํ‘œํ˜„์„ ๋‹ค์–‘ํ•˜๊ฒŒ ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์ƒ์„ฑ๊ณผ ํ‘œํ˜„์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.
    • ์ƒ์„ฑ์€ Builder, ํ‘œํ˜„์€ Director
  3. ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ์ข€๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
    • Builder์—๋Š” ์ œํ’ˆ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ • ์ž์ฒด๊ฐ€ ๋ฐ˜์˜๋˜์–ด ์žˆ๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ˆœ์„œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ํ–‰์œ„๋ฅผ ์ข€๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ด€๋ จ ํŒจํ„ด๊ณผ ์ฐจ์ด์ 

  • ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๋นŒ๋” ํŒจํ„ด๊ณผ ์œ ์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋นŒ๋” ํŒจํ„ด์€ ๋ณต์žกํ•œ ๊ฐ์ฒด์˜ ๋‹จ๊ณ„๋ณ„ ์ƒ์„ฑ์— ์ค‘์ ์„ ๋‘”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋ฐ˜๋ฉด ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์ œํ’ˆ์˜ ์œ ์‚ฌ๊ตฐ์ด ์กด์žฌํ•  ๋•Œ ์œ ์—ฐํ•œ ์„ค๊ณ„์— ์ค‘์ ์„ ๋‘”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋นŒ๋” ํŒจํ„ด์€ ์ƒ์„ฑ์˜ ๋งˆ์ง€๋ง‰์— ์ œํ’ˆ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์ฆ‰์‹œ ์ œํ’ˆ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Reference