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

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

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

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

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

์˜ˆ์‹œ

  • ์ฒซ๋ฒˆ์งธ ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ, ์ƒ์„ฑ์‹œ ์ง€์ •ํ•˜๋Š” ์ธ์ž๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค ํ–ˆ๋‹ค.
  • ์ฆ‰, ํŠน์ • ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๋•Œ ๋งŽ์€ ์ธ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด Builder๋ฅผ ์“ด๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์ ์—์„œ ์šฐ์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ํ™•์ธํ•ด๋ณด์ž.
  • Source Code
internal func Car์™€CarBuilderํ˜ธ์ถœ๋ฐฉ์‹์ฐจ์ดํ™•์ธํ•˜๊ธฐ() {
    print("+++ Car์™€ CarBuilder ํ˜ธ์ถœ๋ฐฉ์‹ ์ฐจ์ด ํ™•์ธํ•˜๊ธฐ +++")
    
    // initializer๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ
    let car1 = Car(brandName: "Ford Mustang",
                  engine: "V8",
                  airbag: true,
                  color: "red",
                  isSelfDrivingAvailable: false,
                  isSexy: false)
    print(car1.description)
    
    // Builder๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ
    let car2 = CarBuilder()
        .brandName("Tesla")
        .engine("Electric motor")
        .airbag(true)
        .color("black")
        .isSelfDrivingAvailable(true)
        .isSexy(false)
        .build()
    
    print(car2.description)
}
  • Car๋Š” 6๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋‹ค.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ Builder๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด method chaining์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
internal func CarBuilder๊ฐ€์žฌ์‚ฌ์šฉ์—์šฉ์ดํ•œ์ด์œ ์•Œ์•„๋ณด๊ธฐ() {
    print("+++ CarBuilder๊ฐ€ ์žฌ์‚ฌ์šฉ์— ์šฉ์ดํ•œ ์ด์œ  ์•Œ์•„๋ณด๊ธฐ +++")
    
    let teslaDefault = CarBuilder()
        // .brandName("Tesla")
        .engine("Electric motor")
        .airbag(true)
        .color("black")
        .isSelfDrivingAvailable(true)
        .isSexy(false)
    
    let modelS = teslaDefault
        .brandName("model S")
        .build()
    
    let model3 = teslaDefault
        .brandName("model 3")
        .build()
    
    let modelX = teslaDefault
        .brandName("model X")
        .build()
    
    let modelY = teslaDefault
        .brandName("model Y")
        .build()
    
    print(modelS.description)
    print(model3.description)
    print(modelX.description)
    print(modelY.description)
}
 
  • ๊ทธ๋Ÿผ method chaining์€ ์™œ ์ข‹์„๊นŒ?
  • ์œ„์˜ ์˜ˆ์‹œ๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๋Œ€๋ถ€๋ถ„ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์ฐจ brand ์ด๋ฆ„๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ์ด๋‹ค.
  • ๊ธฐ๋ณธ ๊ฐ’์€ ๋ชจ๋‘ ๊ฐ™๊ฒŒ ๋งŒ๋“ค๋˜, ์ด ๊ฐ™์€ ๋ถ€๋ถ„์ด ๋ฐ˜์˜๋œ builder๋ฅผ ๊ฐ€์ ธ์™€ ๋ฐ”๋กœ๋ฐ”๋กœ ์ƒ์‚ฐํ•ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ๊ณ„์†ํ•ด์„œ ์ค‘๋ณต๋œ ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์„ ๊ฒƒ์ด๋‹ค.

Reference