프런트엔드/디자인 패턴

[3일차] 팩토리 메서드 | 생성 패턴 5일만에 끝내기 챌린지 - GoF 디자인 패턴

조드래곤나인 2023. 7. 16. 14:42

 

출처: 에릭 감마 , 리처드 헬름 , 랄프 존슨 , 존 블리시디스. 『Gof의 디자인 패턴』. 김정아(역). 프로텍미디어, 2015.

 

 

[3일차] 팩토리 메서드(Factory Method)
생성 패턴 5일만에 끝내기 챌린지 - GoF 디자인 패턴

타입스크립트로 설명하는 GoF 디자인 패턴의 생성 패턴 5일만에 끝내기 챌린지

 

 

팩토리 메서란?

객체를 생성하기 위해 인터페이스를 정의하지만,
어떤 클래스의 인스턴스를 생성할지에 대한 결정은
서브클래스가 내리도록 합니다.

 

 

활용성

1) 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때

2) 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때

 

 

구조 및 구현

구현 방법은 크게 두가지다.

 

1) 추상 클래스와 구체 클래스

abstract class Creator {
    private product!: Product
    anOperation() {
        this.product = this.factoryMethod()
        this.product.doSomething()
    }
    abstract factoryMethod(): Product
}

interface Product {
    doSomething(): void
}
class ConcreteProduct1 implements Product {
    doSomething() {}
}
class ConcreteProduct2 implements Product {
    doSomething() {}
}

class ConcreteCreator1 extends Creator {
    factoryMethod() {
        return new ConcreteProduct1()
    }
}
class ConcreteCreator2 extends Creator {
    factoryMethod() {
        return new ConcreteProduct2()
    }
}
 
class Main {
    creator: Creator
    constructor() {
        this.creator = new ConcreteCreator1()
        this.creator.anOperation()
    }
}

// 다른 서브 클래스 사용
class Main {
    creator: Creator
    constructor() {
        this.creator = new ConcreteCreator2()
        this.creator.anOperation()
    }
}
 

 

2) 팩토리 메서드를 매개변수화 한다.

매개변수를 받아 어떤 종류의 제품을 생성할 지 식별한다.

type CreatorType = 1 | 2

class Creator {
    private product!: Product
    anOperation(type: CreatorType) {
        this.product = this.factoryMethod(type)
        this.product.doSomething()
    }
    factoryMethod(type: CreatorType): Product {
        switch (type) {
            case 1:
                return new ConcreteProduct1()
            case 2:
                return new ConcreteProduct2()
        }
    }
}

interface Product {
    doSomething(): void
}
class ConcreteProduct1 implements Product {
    doSomething() {}
}
class ConcreteProduct2 implements Product {
    doSomething() {}
}
 
class Main {
    creator: Creator
    constructor() {
        this.creator = new Creator()

        const product1 = this.creator.anOperation(1)
        const product2 = this.creator.anOperation(2)
    }
}
 

 


 

 

공식 기술블로그 링크

 

728x90