[생성패턴] Builder Pattern

suojae·2023년 12월 19일
0

[iOS] 디자인패턴

목록 보기
2/10

빌더패턴은 오브젝트의 생성과정이 복잡할 때 간단화시켜주는 용도로 사용할 수 있는 패턴이다! (하나의 오브젝트를 만들기 위해 여러가지 아규먼트가 필요한 경우 등)

고양이를 생각해보자. 고양이 객체를 만들 때 키, 몸무게, 색, 혈핵형, 이름 ... 등의 파라미터가 다수 필요하다고 가정해보자. 고양이 객체를 만들기 위해 아규먼트가 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 클래스의 목적은 하위 빌더들을 특정 특성을 셋팅해주는 것이 목적이다 -> 꼭 사용해주지 않아도 된다!

profile
Hi 👋🏻 I'm an iOS Developer who loves to read🤓

0개의 댓글