Dog foot print

[GOF] 팩토리 메서드 패턴 본문

Architecture

[GOF] 팩토리 메서드 패턴

개 발자국 2021. 10. 17. 15:08

팩토리 메서드 패턴

활용

클래스가 어떤 객체를 생성할지 정확하게 예측할 수 없는 경우가 존재하거나, 클래스의 서브클래스가 해당 객체를 더 구체적인 버전으로 생성하기 원할수도 있는 경우 .

참여 객체

  1. Product : 팩토리가 반환할 추상클래스나 인터페이스를 의미 .
  2. Concrete Product : 팩토리가 실제로 반환하는 객체
  3. Creator : 제품 생성을 하기 위해 접근하는 추상화 팩토리 클래스
  4. Concrete Creator : Concrete Product를 실제로 구체화 하기 위한 생성자 .

이를 클래스 다이어그램으로 표현 하면 다음과 같다.

실생활 예제

 

 

우리가 자동차를 주문하기위해 접근 할 수 있는 공장이 존재한다. 우리는 이 공장에 자동차를 주문하면 우리가 원하는 자동차 가 전달 되는 것을 알지만, 이 자동차가 어떻게 만들어지는지에 대해서는 알지도 못하고, 관심도 없다. 그저 자동차 인터페이스에 맞는 제품이 올바르게 나오기를 바랄 뿐이다.

코드 예시

자동차의 인터페이스와 자동차 인터페이스를 구현한 자동차들

interface Car {
    run(): void
    stop(): void
}


class Genesis implements Car {
    back() {

    }

    run() {

    }

    stop() {

    }
}

class Sonata implements Car {
    run() {

    }

    stop() {

    }
}

class Avante implements Car {
    run() {

    }

    stop() {

    }
}

우리가 접근 할 수 있는 현대 자동차 공장의 모습

enum HyundaiCarName {
    genesis,
    sonata,
    avante
}

class HyundaiCarFactory {
    buildCar(name: HyundaiCarName): Car {
        switch (name) {
            case HyundaiCarName.avante:
                return new Avante();
            case HyundaiCarName.genesis:
                return new Genesis();
            case HyundaiCarName.sonata:
                return new Sonata();
        }
    }
}

주문

const factory = new HyundaiCarFactory();
let myCar: Car = factory.buildCar(HyundaiCarName.genesis)

문제점

우리는 Car 인터페이스를 따르는 제네시스를 뽑았다. 그러나 Genesis는 고급 차라서 후진이 기능이 탑재되어 있었다. 그렇지만 공장은 자동차의 인터페이스를 따르는 객체를 리턴하기 때문에 공장 내부에서 만들고 반환 하기 전까지는 어떤 자동차를 반환하는지 전혀 모른다.

타입 단언으로 해결

let myCar = factory.buildCar(HyundaiCarName.genesis) as Genesis
myCar.back()

타입 단언으로 Genesis임을 명시 해줄 수 있지만 이는 타입 안정성을 크게 해친다.

만약 이를 해결하기 위해서 자동차 인터페이스에 필요없는 메서드를 모두 명시를 해준다면 가독성이나 타입안정성이 매우 떨어지게 된다.

결론

팩토리 메서드 패턴은 동일한 인터페이스 혹은 특정 클래스의 서브 클래스들을 사용 할 때 유용해보인다. 여기서 중요한 점은 동일한 인터페이스 인 것 같다. 팩토리를 통해 제공된 서브 클래싱 인스턴스들은 겉보기에는 동일한 멤버를 가지고 있지만, 내부 구현은 모두 다를 수 있다.이처럼 제공되는 인터페이스는 모두 같지만 내부 구현이 다른 서브클래스들을 활용하는 것이 팩토리 메서드패턴을 잘 활용하는 방법인 듯 하다.

만약 사용자가 팩토리로부터 제공 받은 모든 인스턴스를 타입 캐스팅을 하려고 한다면 이는 코드의 복잡성을 증가 시킬 우려가 존재하기에 이 경우 팩토리 메서드 패턴은 알맞은 방법이 아닌 것으로 판단된다.
#GOF #생성패턴

반응형

'Architecture' 카테고리의 다른 글

[GOF] Builder 패턴  (0) 2021.10.23
[GOF] 추상 팩토리 메서드 패턴  (0) 2021.10.23
[Architecture] S.O.L.I.D [D]  (0) 2021.05.13
[Architecture] S.O.L.I.D [I]  (0) 2021.05.11
[Architecture] S.O.L.I.D [L]  (0) 2021.05.06
Comments