์ผ๋ง์ ์ ์น๊ตฌ๊ฐ Builder ํจํด์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋๊ณ ๋ฌผ์ด๋ด์... ์ด๋ผ๋ผ? ๊ทธ๊ฒ ๋ญ์ง? Σ(๏ผ ๏ฝฅ`ะด๏ฝฅ´) ํ๊ณ ๊ฐ๋จํ๊ฒ ์์นญ์ ํด๋ดค์ต๋๋ค.
๊ทผ๋ฐ ์ฅ ? ์ด๊ฑฐ ์ด๋์ ๋ง์ด ๋ณธ ๋ชจ์ต์ธ๋ฐ... ?!
public class TestBuilderPattern {
public static void main(String[] args) {
Computer comp = new Computer.ComputerBuilder("500 GB", "2 GB")
.setBluetoothEnabled(true)
.setGraphicsCardEnabled(true)
.build();
}
}
(์ฝ๋ ์ถ์ฒ๋ ์๊ธฐ)
iOS ๊ฐ๋ฐ ํ์๋ ๋ถ๋ค์ ์ต์ํ์ค SwiftUI์ ๋์๊ฐ ๋๋ ๊ฒ ๊ฐ์ง ์๋์ ?!
์์ง ์ค์ ๊ณต๋ถ๋ฅผ ์ ๋๋ก ์ํด๋ด์ ์ ๋ชจ๋ฅด์ง๋ง ์๋ฌด๋๋ ์๊ธด๊ฑด ์ ๋ง ๋น์ทํ ๊ฒ ๊ฐ์ต๋๋ค!
์ด๋ ๊ฒ ๋ ๊น์ ํ ๋ฒ ๊ณต๋ถ๋ฅผ ์ ๋๋ก ํด๋ณด๋ฉด ์ข๊ฒ ๋ค & ๋์์ธ ์์คํ ๊ตฌ์ถ์ ์ ์ฌ์ฉํด๋ณผ ์ ์์ ๊ฒ ๊ฐ์์ ํ ๋ฒ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค โ(หโฃห)ส
(์ ๋์์ธ ์์คํ ๊ตฌ์ถ์ ์ ์ฌ์ฉํด๋ณผ ์ ์์ ๊ฒ ๊ฐ๋๊ตฌ์ ... ?! ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ด์ง๋ง ๊ทธ๊ฑด ๋ค์์ ใ ใ ~)
์๋์ ๋ด์ฉ์ Refactoring.guru์ ๋์์ธ ํจํด์ ๋ฐ์ด๋ค๊ธฐ ์ฑ ์ ์ฝ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค โโ (เธ หωห )เธง โพโพ
Builder ํจํด
์ ๋ ์ต๊ทผ์ ์ ๋ง ๋ง์ด ์ด๋ฐ ์ํฉ์ ๊ฒช์๋๋ฐ์
ํ๋์ ํด๋์ค๋ก ์ํ๋ ์ํฉ์ ๋ชจ๋ ํํํ ์ ์๋ ๋ค์ํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค๋ณด๋ฉด... ํด๋น ํด๋์ค์ initializer ํ๋ผ๋ฏธํฐ๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋๋ ๊ฒฝํ ํน์ ๋ค๋ค ์์ผ์ ๊ฐ์?
๊ฐ์ฅ ๊ธฐ์ต์ ๋จ๋ ์์๋ก๋ ์๋ ์ ๋ง๋ค์๋ ์ปค์คํ alert ViewController๊ฐ ์๊ฐ๋ฉ๋๋ค.
func setViewData(type: CustomAlertType,
buttonType: CustomAlertButtonType,
buttonStyle: iMAlertButtonStyle,
title: String? = nil,
bodyMessage: String,
subMessage: String? = nil,
subMessageHandler: (() -> Void)? = nil,
okButtonTitle: String = Strings.Common.confirm,
cancelButtonTitle: String? = Strings.Common.cancel,
okButtonHandler: (() -> Void)? = nil,
cancelButtonHandler: (() -> Void)? = nil,
isNeedNetworkCheck: Bool = false,
textAlignment: NSTextAlignment = .center
)
ํ๋์ ViewController๋ก ๋ค์ํ ์ํฉ์ ๋ชจ๋ ํํํด์ค์ผ ํ๋ค๋ณด๋ ์ด๋ ๊ฒ ๋ง์ ํ๋ผ๋ฏธํฐ๋ค์ด ์ถ๊ฐ๋๊ธฐ ์์ํ๋๋ผ๊ตฌ์.
๊ทธ๋ฆฌ๊ณ ๋ณด์๋ฉด default value๋ก nil์ด ๋ค์ด๊ฐ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ ๊ทธ๋งํผ ํด๋น ํ๋ผ๋ฏธํฐ๋ค์ ์ฌ์ฉ๋์ง ์๋๋ค๋๊ฑธ ์ ์ ์์ด์.
๊ทธ๋์ Builder ํจํด์ ์ฒซ ๋ฌธ์ฅ์ ์ฝ๊ณ ์ ์ด๊ฑฐ๋ค ! ์ถ์๋ต๋๋ค.
์ด๋ฌํ ์ํฉ์ ํผํ๊ธฐ ์ํด ๊ฐ ํน์ฑ์ ๋ง๋ ๋น๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ฐ๋ก ๋น๋ ํจํด์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋น๋๋ค์ ์กฐ์ข ํ๋ ๊ฐ์ฒด๊ฐ ํ๋ ๋ ์๋๋ฐ ๋ฐ๋ก ๋๋ ํฐ์ ๋๋ค.
์ด ๋๋ ํฐ๋ ๋น๋ ๋ด๋ถ์ ๋ฉ์๋๊ฐ ๋์ํ๋ ์์๋ฅผ ์ ํ๊ณ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ๊ฐ์ฒด์ ๋๋ค.
์กฐ๊ธ ๋ ์์ธํ ์ค๋ช ์ ๋ค์์ ๋ ํด๋ณผ๊ฒ์!
์์
์๋ฅผ ๋ค์ด ์ง์ ๋ง๋๋ HouseBuilder๊ฐ ์๊ณ ๋ด๋ถ์ ๊ฐ๋ฅํ ๋ฉ์๋๋ก๋ makeDoors(), makeWalls(), makeRoof(), makeSwimmingPool() ๊ฐ ์๋ค๊ณ ํด๋ด ์๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ง์ ๊ฑด์คํ ๋๋
let builder = HouseBuilder()
builder.makeDoors()
.makeWalls()
.makeRoof()
์ด๋ ๊ฒ ํ์ํ ๋ฉ์๋๋ค๋ง ๊ณจ๋ผ์ ์คํ์์ผ์ฃผ๋ฉด ๋ฉ๋๋ค. ๋ชจ๋ ์ง์ ์์์ฅ์ด ์์ ํ์๋ ์์์์ ?!
์ด๋ ๋ฏ์ด Builder ํจํด์์๋ ์ํ๋ ๊ฐ์ฒด ์์ฑ์ ํ์ํ ๋ฉ์๋๋ง ํธ์ถํ๋ฉด ๋๋ค๋ ํน์ง์ด ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋์ ๋น๋ ๊ฐ์ฒด์ ์ฐ์์ ์ผ๋ก ๋ฉ์๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๊ฐ ์์ฑ ๋~! ๋๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ์์ฑ๋๋ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค๋ ํน์ง๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ง์ ๋๋ก ์ง์ ์๋ ์๊ณ , ๋๋ฌด๋ก๋ ์ง์ ์ ์๊ณ , ์ฒ ๋ก๋ ์ง์ ์ ์์์์ ? ํ์ง๋ง ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ง๋ค๊ฑฐ๋ ๋ฒฝ์ ์ธ์ฐ๊ณ ์ง๋ถ์ ์ฌ๋ฆฌ๋ ๊ณผ์ ์ ๋ค ํ์์ ์ด์ฃ . ์ฌ๋ฃ๋ง ๋ค๋ฅผ ๋ฟ!
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ HouseBuilder Protocol์ ์ ์ธํด๋ ๋ค StoneHouseBuilder class์์ ์ด๋ฅผ ์ฑํํ๋ ํ์์ผ๋ก ์งํํ ์ ์์ต๋๋ค!
protocol HouseBuilder {
func makeDoors()
func makeWalls()
func makeRoof()
func makeSwimmingPool()
}
class StoneHouseBuilder: HouseBuilder {
func makeDoors() { ๋๋ฌธ ๋ง๋ค๊ธฐ... }
func makeWalls() { ๋๋ฒฝ ๋ง๋ค๊ธฐ... }
func makeRoof() { ๋์ง๋ถ ๋ง๋ค๊ธฐ... }
func makeSwimmingPool() { ๋๋ก ๋ ์์์ฅ ๋ง๋ค๊ธฐ... }
}
์ด๋ฐ ์์ผ๋ก ๊ตฌํํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค!
์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ Builder๋ฅผ ํธ์ถํ๋ Director ํน์ ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ํน์ Builder ํด๋์ค(StoneHouseBuilder์ฒ๋ผ)๊ฐ ์๋ HouseBuilder ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋๋ก ๊ตฌํํด์ผ๊ฒ ์ฃ ?
Director
์์์ ๋๋ ํฐ๋ ๋น๋ ๋ด๋ถ์ ๋ฉ์๋๊ฐ ๋์ํ๋ ์์๋ฅผ ์ ํ๊ณ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ๊ฐ์ฒด์ ๋๋ค. ๋ผ๊ณ ํ์๋๋ฐ
์ด ๋๋ ํฐ์ ๋ํด์ ์กฐ๊ธ ๋ ์์๋ณด๊ฒ ์ต๋๋ค.
๋น๋๊ฐ ์ง์ ๋ง๋๋ ๊ตฌํ ๊ณผ์ ์ ์ ๊ณตํ๊ณ ์๋ค๋ฉด ๋๋ ํฐ ํด๋์ค๋ ์ ์ ์์๋ฅผ ์ ์ํ๋ ์ญํ ์ ๋ด๋นํ๊ณ ์์ต๋๋ค.
๋น๋๋ ๋ฌธ ๋ง๋๋ ๋ฒ, ๋ฒฝ ๋ง๋๋ ๋ฒ, ์ง๋ถ ๋ง๋๋ ๋ฒ์ ์์ง๋ง ๊ทธ ์์์ ๋ํด์๋ ์๋ฌด๊ฒ๋ ์์ง ๋ชปํฉ๋๋ค.
๋ฒฝ ์์ด ์ง๋ถ์ ์ฌ๋ฆด ์๋ ์๋ ๋ฒ์ด์์์? ์ด๋ฐ ๋น๋๋ฅผ ๋๋ ํฐ์๊ฒ ๋๊ธฐ๋ฉด
๋๋ ํฐ๊ฐ ๋น๋์๊ฒ ๋ฒฝ ๋จผ์ ๋ง๋ค๊ณ ! ๋ฌธ ๋ง๋ค๊ณ ๊ทธ๋ฆฌ๊ณ ์ง๋ถ ์ฌ๋ ค! ์ด๋ ๊ฒ ๋ช ๋ น์ ํ๊ฒ ๋ฉ๋๋ค.
ํ์ง๋ง ๋๋ ํฐ ํด๋์ค๋ ํ์๋ ์๋๋๋ค! ์๋๋ฉด ์์ ์์ ํํธ๋ง ๋ด๋ ๋๋ ํฐ์์ด ๋น๋๋ง์ผ๋ก๋ ์ ์งํํ์์์?
๋น๋ํํ ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ํ๋ํ๋ ์์๋ฅผ ์๋ ค์ฃผ๋ฉด์ ๋ง๋๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
ํ์ง๋ง ๋๋ ํฐ ํด๋์ค๋ฅผ ํ์ฉํ๋ค๋ฉด ๋ช๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค.
๋จผ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
๋๋ ํฐ ํด๋์ค ์์ด ๋น๋๋ง ์ฌ์ฉํ๋ค๋ฉด ์ง์ ํ๋ ๋ง๋ค๊ณ ์ ํ๋ฉด ๋ฒฝ ๋จผ์ ๋ง๋ค๊ณ ! ๋ฌธ ๋ง๋ค๊ณ ๊ทธ๋ฆฌ๊ณ ์ง๋ถ ์ฌ๋ ค! ์ด ๊ณผ์ ์ ๋งค๋ฒ ์๋ ค์ค์ผ ๋น๋๋ ์ผํ ์ ์์ต๋๋ค. ๋ง์ฝ ๊ณผ์ ์ด ๋ ๊ธธ์ด์ง๊ณ ์ฌ๋ฌ๋ฒ ์ฌ์ฉ๋๋ค๋ฉด ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ๋ง์ด ๋์ด๋๊ฒ ์ฃ ?
ํ์ง๋ง ๋๋ ํฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ธฐ๋ณธ ์ง ๋ง๋ค์ด์ค~ ํ๋ฒ๋ง ์๊ธฐํ๋ฉด ์ด ๋ด๋ถ์ ๋ฒฝ ๋จผ์ ๋ง๋ค๊ณ ! ๋ฌธ ๋ง๋ค๊ณ ๊ทธ๋ฆฌ๊ณ ์ง๋ถ ์ฌ๋ ค! ์ด ๋ด์ฉ์ด ํฌํจ๋ผ์์ ๊ฒ ์ด๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ค๋ณต๋๋ ์ฝ๋๋ ํจ์ฌ ์ค์ด๋ค๊ฑฐ๊ตฌ์!
๋๋ฒ์งธ๋ก๋ ์ธ๋ถ๋ก๋ถํฐ ๋ด๋ถ ๊ตฌํ ์์ค๋ฅผ ์จ๊ธธ ์ ์์ต๋๋ค.
์ฌ์ค ์ง์ ๋ง๋ค ๋ ์ด๋ค ์ฌ๋ฃ๋ค์ด ํ์ํ์ง, ์ด๋ค ๊ณผ์ ๋ค์ ๊ฑฐ์ณ์ผํ๋์ง ํด๋ผ์ด์ธํธ๊ฐ ์ ํ์๊ฐ ์์๊น์...?
๊ทธ๋ฅ ๋ช ๋ น๋ง ๋ด๋ฆฌ๋ฉด ์์์ ์ง์ ๋ง๋ค์ด์คฌ์.. ํ๋๊ฒ ์ฐ๋ฆฌ์ ๋ง์ด์์์?
๋๋ ํฐ ๋ด๋ถ๋ก ๋น๋์ ๋ก์ง์ ๋ฃ์ผ๋ฉด์ ์บก์ํ๋ฅผ ์ํด์ผ๋ก์จ ๊ฒฐํฉ๋๋ฅผ ๋ณด๋ค ๋ฎ์ถ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค!
ํ์ง๋ง ์ธ์ ๋ ์ค๋ฒ์์ง๋์ด๋ง์ ๋ํ ๊ฒฝ๊ฐ์ฌ์ ๊ฐ๊ณ ์๋ ๊ฒ๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ๋๋ฌด ๋ณต์กํ ๋น๋ ๋ก์ง์ด ์๋ค๋ฉด ? ๋๋ ํฐ๊ฐ ๊ณผ์ฐ ์ง๊ธ ํ์ํ๊ฐ? ์ ๋ํ ๊ณ ๋ฏผ๋ ๋ ํด๋ณด๊ณ ๊ฒฐ์ ํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฝ๋
์ฌ์ค ์ ๋ ๊ฐ๋ ๋ง ๋ณผ ๋๋ณด๋ค ์ฝ๋๋ก ๋ณด๋๊ฒ ํจ์ฌ ์ดํด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ก ํ ๋ฒ ๋ณด๊ฒ ์ต๋๋ค!
- ์์ฑํ Product
class Product1 {
private var parts = [String]()
func add(part: String) {
self.parts.append(part)
}
func listParts() -> String {
return "Product parts: " + parts.joined(separator: ", ") + "\n"
}
}
์ด๋ฌํ Product1 ํด๋์ค๊ฐ ์๊ณ ์ด ํด๋์ค์ ๋ํด ๋ง์ configuration์ด ํ์ํ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
- Builder protocol
protocol Builder {
func producePartA()
func producePartB()
func producePartC()
}
Builder๊ฐ ๋ฐ๋์ ๊ฐ์ ธ์ผํ๋ ๋ฉ์๋๋ค์ ์ ์ธํ Builder protocol์ด ์๊ณ
- Builder ๊ตฌํ์ฒด
class ConcreteBuilder1: Builder {
private var product = Product1()
func reset() {
product = Product1()
}
func producePartA() {
product.add(part: "PartA1")
}
func producePartB() {
product.add(part: "PartB1")
}
func producePartC() {
product.add(part: "PartC1")
}
func retrieveProduct() -> Product1 {
let result = self.product
reset()
return result
}
}
ํด๋น ํ๋กํ ์ฝ์ ์ฑํํ ConcreteBuilder1 ํด๋์ค๊ฐ ์์ต๋๋ค.
๋ด๋ถ ์ฝ๋๋ฅผ ๋ณด๋ฉด Builder ํ๋กํ ์ฝ ์ฑํ์ผ๋ก ์ธํด producePartA, B, C ๋ฉ์๋๋ฅผ ๊ตฌํํด์คฌ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ reset(), retrieveProduct() ๋ฉ์๋๊ฐ ์์ต๋๋ค.
๋จผ์ retrieveProduct๋ฅผ ๋ณด๋ฉด ์ง๊ธ๊น์ง ์์ฑ๋ product๋ฅผ ๋ณ์์ ์ ์ฅํด๋๊ณ reset ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์ด๊ธฐํ์์ผ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณ์์ ์ ์ฅํด๋๋ result๋ฅผ ๋ฆฌํดํด์ฃผ๊ณ ์์ต๋๋ค.
retrieveProduct ๋ฉ์๋๋ ๊ทธ๋ฅ ์์ฑํ product๋ฅผ ๋ฆฌํดํด์ฃผ๋ ๋ฉ์๋์ธ๋ฐ ์ ํ๋กํ ์ฝ์ ์ ์๋ผ์์ง ์์๊น์?
์๊ฐํด๋ณด๋ฉด Builder ํ๋กํ ์ฝ์ ์ฑํํ ๊ตฌํ์ฒด Builder๋ค์ด ๋ชจ๋ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์๊ฒ๋๋ค.
Builder๋ผ๋ ํ๋กํ ์ฝ์ ๋จ๊ณ๋ฅผ ๋ช ์ํด์ค ๋ฟ ๊ทธ๋ก ์ธํด ๋ง๋ค์ด์ง๋ ๊ฒฐ๊ณผ๋ฌผ์๋ ์ ์ฝ์ ๊ฑธ์ง ์์๊ธฐ ๋๋ฌธ์ด์ฃ !
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Builder ํ๋กํ ์ฝ์ ํด๋น ๋ฉ์๋๋ฅผ ๋ช ์ํด์ฃผ์ง ์์๊ฑฐ์ฃ .
ํ ๊ทผ๋ฐ ์ ๋ค๋ฆญ ๋ฉ์๋๋ก ์์ฑํ๋ฉด ์๋ง ๊ฐ๋ฅํ ๊ฒ ๊ฐ๊ธดํ๋ค์ ๐ค
protocol Builder<T> {
func retrieveProduct() -> T
}
๋ง์ฝ ์ด๋ ๊ฒ ํ๋ค๋ฉด... ?!
๊ทธ๋ฆฌ๊ณ reset ๋ฉ์๋๋ ํธ์ถํด์ฃผ๊ณ ์๋๋ฐ ๋ณดํต ๊ฒฐ๊ณผ๋ฌผ์ ํ๋ ์ป๊ณ ๋๋ฉด ๊ทธ ํ์ ์ด๊ธฐ์ํ๋ถํฐ ๋ค์ ๊ฑด์คํ ๊ฒ์ ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์ reset ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ ๊ฐ๋ค์.
์ด ๋งฅ๋ฝ์์ defer๋ฅผ ํ์ฉํด๋ณผ ์๋ ์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค!
- Director
class Director {
private var builder: Builder?
func update(builder: Builder) {
self.builder = builder
}
func buildMinimalViableProduct() {
builder?.producePartA()
}
func buildFullFeaturedProduct() {
builder?.producePartA()
builder?.producePartB()
builder?.producePartC()
}
}
๊ทธ๋ฆฌ๊ณ Director class ์ ๋๋ค!
์์์ ์ธ๊ธํ๋ ๊ฒ ์ฒ๋ผ Director class๋ concrete builder class ํ์ ์ ๊ฐ๊ณ ์์ง ์๊ณ Builder protocol ํ์ ์ ๊ฐ๊ณ ์๋ค์.
์ด๋ก ํ์ฌ๊ธ Builder ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์๋ค๋ฉด ๋ชจ๋ Director์์ ํ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ฌผ๋ก ์ด๋ค ํ์ ์ด ๋์ฌ์ง ๋ชจ๋ฅด๋๊ฑฐ๊ตฌ์! (๋ง์ฝ ConcreteBuilder1์ผ๋ก ํ์ ์ด ์ ํ๋ผ์๋ค๋ฉด ๊ฒฐ๊ณผ๋ฌผ๋ Product1์ผ๋ก ์ ํํ ์ ์์๊ฒ ์ฃ ? ๊ทผ๋ฐ ๊ทธ๋ฌ๋ฉด ์ํ๋ ๊ฐ์ฒด ํ์ ๋ง๋ค Builder ๋ฟ๋ง ์๋๋ผ Director๋ ๋ค ๋ฐ๋ก ์์ฑํด์ค์ผํจ....๐ซ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค!)
Director ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค๊ฐ update ๋ฉ์๋๋ก builder๋ฅผ ๋ณ๊ฒฝํด์ค ์๋ ์๊ตฌ์
buildMinimalVisibleProduct(), buildFulllFeaturedProduct() ๋ฉ์๋ ๋ด๋ถ์๋ ํด๋น ๋น๋ ํ๋กํ ์ฝ์ ์ ์ธ๋ ๋ฉ์๋๋ค์ ์ํ๋ ์์๋๋ก ๊ตฌ์ฑ๋๋ก ์คํ์์ผ์ค์ ๋ฐ๋ผ ์์ฑ ํ๋ก์ธ์ค๋ฅผ ์ ์ธํด๋ ์ ์์ต๋๋ค.
- Client
class Client {
// ...
static func someClientCode(director: Director) {
let builder = ConcreteBuilder1()
director.update(builder: builder)
print("Standard basic product:")
director.buildMinimalViableProduct()
print(builder.retrieveProduct().listParts())
print("Standard full featured product:")
director.buildFullFeaturedProduct()
print(builder.retrieveProduct().listParts())
// Director ์์ด product ์์ฐํ๊ธฐ!
print("Custom product:")
builder.producePartA()
builder.producePartC()
print(builder.retrieveProduct().listParts())
}
// ...
}
Client class๋ ๋ด๋ถ์ director๋ฅผ ๋ณ์๋ก ๊ฐ๊ณ ์๋ ์ํ์ ๋๋ค.
์ฌ๊ธฐ์ ์ํ๋ Builder ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ update ๋ฉ์๋๋ก ํด๋น builder ๊ฐ์ฒด๋ฅผ ์ฅ์ฐฉํฉ๋๋ค!
๊ทธ ํ ์ํ๋ ํผ์ณ๊ฐ ์๋ฐ๋ฉด? director์๊ฒ ๋ช ๋ น๋ง ๋ด๋ฆฌ๋ฉด builder๊ฐ ๋๋ฑ๋๋ฑ ์ผ์ ํ๊ฒ ๋๋๊ฑฐ์ฃ .
๊ทธ๋ฆฌ๊ณ ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ์ ๊ทผํ๊ณ ์ถ์ ๋๋ builder์๊ฒ ์ง์ retrieveProduct ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด builder๋ ๋ง๋ค์ด๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฆฌํดํ๊ณ ์๊ธฐ ์์ ์ ์ด๊ธฐํ์ํต๋๋ค. ๊ทธ๋ ๊ฒ ๋ค์ ์๋ก์ด ๊ฒฐ๊ณผ๋ฌผ ์์ ์ ์์ํ ์ ์๋ ์ํ๊ฐ ๋๋๊ฑฐ์ฃ !
ํญ์ ๋ฐ ์ ๋๋ง ์ดํดํ๊ณ ์์๋ ๊ฒ ๊ฐ์ ๋น๋ ํจํด์ ๋ํด ์กฐ๊ธ ๋ ์์ธํ ์์๋ดค์ต๋๋ค!
์ด ๋ด์ฉ์ ํ ๋๋ก ๋์์ธ ์์คํ ์ ์กฐ๊ธ์ด๋๋ง ์ ์ฉํด๋ณด๊ณ ์ ํ๋๋ฐ ๋ง์ฝ์ ์ฑ๊ณตํ๋ค๋ฉด ํ๊ธฐ๊ธ๊ณผ ํจ๊ป ๋ค์ ๋์์ค๊ฒ ์๋๋ค ใหฬตอฬแดโใ
'๐พ Common' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Github] Reviewer, Assignees ์๋ ์ง์ ํ๊ธฐ (0) | 2024.04.16 |
---|