빌더패턴은 오브젝트의 생성과정이 복잡할 때 간단화시켜주는 용도로 사용할 수 있는 패턴이다! (하나의 오브젝트를 만들기 위해 여러가지 아규먼트가 필요한 경우 등)
고양이를 생각해보자. 고양이 객체를 만들 때 키, 몸무게, 색, 혈핵형, 이름 ... 등의 파라미터가 다수 필요하다고 가정해보자. 고양이 객체를 만들기 위해 아규먼트가 3개이상 들어가게 되면 매우 안좋은 코드가 된다.
class Cat {
let height: Int
let weight: Int
let color: String
init(height: Int, weight: Int, color: String) {
self.height = height
self.weight = weight
self.color = color
}
func printDetails() {
print("\(height)cm, \(weight)kg, \(color)")
}
}
class CatBuilder {
private var height: Int?
private var weight: Int?
private var color: String?
func setHeight(_ height: Int) -> CatBuilder {
self.height = height
return self
}
func setWeight(_ weight: Int) -> CatBuilder {
self.weight = weight
return self
}
func setColor(_ color: String) -> CatBuilder {
self.color = color
return self
}
func build() -> Cat? {
guard let height = height, let weight = weight, let color = color else {
return nil
}
return Cat(height: height, weight: weight, color: color)
}
}
// Creating and configuring a Cat instance using the Builder Pattern
if let cat = CatBuilder()
.setHeight(20)
.setWeight(19)
.setColor("green")
.build() {
cat.printDetails()
}
//20cm,19kg,green
위와 같이 self를 리턴해주게 되면 선언형으로 간편하게 복잡한 객체를 만들 수 있다!
class WhiteCatBuilder: CatBuilder {
override init() {
super.init()
setColor("white")
}
}
class BlackCatBuilder: CatBuilder {
override init() {
super.init()
setColor("black")
}
}
if let whiteCat = WhiteCatBuilder().setHeight(10).setWeight(10).build() {
whiteCat.printDetails()
}
if let blackCat = BlackCatBuilder().setHeight(20).setWeight(20).build() {
blackCat.printDetails()
}
class Director {
func setSmallCat(builder: CatBuilder) {
builder.setWeight(5).setHeight(5)
}
func setBigCat(builder: CatBuilder) {
builder.setWeight(100).setHeight(100)
}
}
// Using the Director to build a cat
let director = Director()
let blackCatBuilder = BlackCatBuilder()
director.setBigCat(builder: blackCatBuilder)
if let cat = blackCatBuilder.build() {
cat.printDetails()
}
한 발자국 더 나아가면 위와 같이 베이스 빌더를 기준으로 각 특성을 가진 하위 빌더들을 만들어낼 수 있다
CatBuilder를 기준으로 whiteCatBuilder, blackCatBuilder라는 하위 빌더를 만들어 객체를 찍어낼 수 있다!
Director 클래스의 목적은 하위 빌더들을 특정 특성을 셋팅해주는 것이 목적이다 -> 꼭 사용해주지 않아도 된다!