Factory Method Pattern을 알아보자!

oto·2023년 4월 19일
0

Factory Method Pattern 왜 쓸까?

Factory Method Pattern은 인스턴스화에 대한 책임을 Creator 클래스나 Creator 메서드에게 넘기는 것으로 인스턴스 생성과 사용을 분리합니다. 이렇게 함으로써 객체 생성에 필요한 정보를 Creator 클래스나 Creator 메서드에서만 다루기 때문에 유연하게 코드를 구성할 수 있습니다. 또한, 객체 간의 결합도가 낮아지기 때문에 코드의 재사용성을 높일 수 있습니다.

Factory는 물건을 만드는 곳입니다. 여기서 만들어진 물건이 바로 인스턴스를 의미합니다. 여기서 구현하게 될 Factory class에서는 보통 Creator라고하며, 인스턴스를 생성을 관리합니다. 실제 인스턴스화에 필요한 클래스들은 Product에서 담당을 합니다.

Factory Method Pattern 구현해보기

오늘은 춤추는 인형을 만들어봤습니다.

enum DanceType: String {
    case hiphop
    case chachacha
    case samba
}

// Product
protocol DancingDoll {
    var danceType: DanceType { get }
    func dance()
    func stop()
}

struct HiphopDancingDoll: DancingDoll {
    var danceType: DanceType
    
    func dance() {
        print("hiphop time")
    }
    
    func stop() {
        print("stop hiphop")
    }
}

struct ChachachaDancingDoll: DancingDoll {
    var danceType: DanceType
    
    func dance() {
        print("chachacha time")
    }
    
    func stop() {
        print("stop chachacha")
    }
}

struct SambaDancingDoll: DancingDoll {
    var danceType: DanceType
    
    func dance() {
        print("ssamba time")
    }
    
    func stop() {
        print("stop samba")
    }
}

danceType에 따라 춤추는 인형 클래스를 만들었습니다. 이 부분이 DancingDoll Protocol을 준수하는 ConcreateProduct입니다.

// Creator
class DancingDollFactory {
    static func createDancingDoll(type: DanceType) -> DancingDoll {
        switch type {
        case .hiphop:
            return HiphopDancingDoll(danceType: type)
        case .chachacha:
            return ChachachaDancingDoll(danceType: type)
        case .samba:
            return SambaDancingDoll(danceType: type)
        }
    }
}

DanceType에 따라 ConcreateProduct의 인스턴스를 생성해주는 Creator입니다. 여기서는 createDancingDoll() 메소드가 팩토리 메소드 역할을 합니다.

let hiphop = DancingDollFactory.createDancingDoll(type: .hiphop)
hiphop.dance()
let cha = DancingDollFactory.createDancingDoll(type: .chachacha)
cha.dance()
let ssamba = DancingDollFactory.createDancingDoll(type: .samba)
ssamba.dance()

이런식으로 DancingDollFactory를 통해 인스턴스를 생성해줄 수 있습니다.

결론

Factory Method Pattern은 인스턴스 생성의 책임을 Creator에게 위임하고, 이를 통해 유연하고 확장 가능한 코드를 작성할 수 있도록 도와줍니다. 이 패턴을 사용하면 인스턴스 생성 코드가 전체 코드에 흩어지지 않게 되어 코드 유지보수성이 향상됩니다.

하나의 프로토콜을 따르는 여러 타입이 있고, 인스턴스화하기 위해 적절한 타입을 런타임에서 선택해야 할 때 유용합니다.

하지만, 모든 상황에서 Factory Method Pattern가 만능은 아닙니다. 위에서의 DancingDoll 같은 단순한 상황의 인스턴스 생성이나 인스턴스 간의 의존성이 낮은 경우에는 패턴 적용이 번거롭습니다. 따라서 상황에 맞게 적절하게 패턴을 적용해야합니다.

profile
iOS Developer

0개의 댓글