Factory Pattern 에 대하여

Factory Pattern 에 대하여

지난 싱글톤 패턴 포스팅에 이어 팩토리 패턴에 대해서 알아보도록 하겠습니다.

Factory Pattern

팩토리 패턴은 객체를 생성하는 로직을 분리하여 관리하는 디자인 패턴입니다.

이를 통해 객체를 사용하는 코드에서는 직접 인스턴스를 생성하는 대신, 생성 과정이 추상화된 인터페이스를 활용할 수 있습니다.

또한, 이 패턴은 상속 구조를 기반으로 동작하며 상위 클래스에서는 핵심적인 흐름을 정의하고, 하위 클래스에서는 구체적인 객체 생성 방식만을 담당합니다.

상위 클래스와 하위 클래스가 분리가 되는 상황이기 때문에,
느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 알 필요가 없어 유연합니다.

객체의 생성을 담당하는 로직은 분리되어 있기 때문에 코드 리팩토링 시 유지보수성 또한 좋습니다.

예를 들어 스포츠카 제작, 전기차 제작, SUV 제작과 같은 구체적인 제작과정이 있는 하위 클래스가 있다고 가정해봅시다.

이 하위 클래스들의 상위 클래스인 자동차 공장에서 이러한 제작과정을 기반으로 엔진, 배터리 등의 부품을 조립하여 완성된 차량을 생산하는 방식으로 이해하면 편합니다.

자바스크립트에서의 팩토리 패턴

자바스크립트에서 팩토리 패턴을 구현한 코드는 아래와 같습니다.

const num = new Object(77);
const str = new Object("do-not-do-that");

num.constructor.name; // Number
str.constructor.name; // String

어떤 것을 전달하느냐에 따라서 다른 타입의 객체를 생성하는 것을 볼 수 있습니다.

즉, 전달받은 값에 따라서 다른 객체를 생성하며 인스턴스 타입을 정하는 것입니다.

아래는 위에서 예시로 든 자동차 공장을 기반으로 전기차를 생산하는 코드입니다.

class CarFactory {
    static createCar(type) {
        const factory = factoryList[type]
        return factory.createCar()
    }
}   

class SportsCar {
    constructor() {
        this.name = "Sports Car"
    }
}

class ElectricCar {
    constructor() {
        this.name = "Electric Car"
    }
} 

class SportsCarFactory extends CarFactory {
    static createCar() {
        return new SportsCar()
    }
}
class ElectricCarFactory extends CarFactory {
    static createCar() {
        return new ElectricCar()
    }
}

const factoryList = { SportsCarFactory, ElectricCarFactory } 

const main = () => {
    // 전기차를 만든다.  
    const car = CarFactory.createCar("ElectricCarFactory")  
    // 차량 이름을 출력한다.  
    console.log(car.name) // Electric Car
}
main()

CarFactory 라는 상위 클래스가 뼈대이고, 하위 클래스인 ElectricCar 가 구체적인 내용을 결정합니다.

이는 의존성 주입이라고도 볼 수 있습니다.

CarFactory에서 직접 ElectricCarFactory 의 인스턴스를 생성하는게 아니라
ElectricCarFactory에서 생성한 인스턴스를 CarFactory에 주입하고 있기 때문입니다.

추가로, CarFactory 클래스의 static 키워드를 통해 createCar() 메서드를 정적 메서드로 선언했는데,

이는 클래스 기반으로 객체를 만들지 않고 호출이 가능하게 합니다.

(따라서 해당 메서드에 대한 메모리 할당을 한 번만 할 수 있습니다.)

일반적으로 팩토리 메서드는 특정 인스턴스에 종속되지 않고,

단순히 요청된 객체를 생성하는 역할을 합니다.

특정 객체의 상태를 참조하지 않기 때문에

개별 인스턴스가 아닌 클래스 레벨에서 관리하면 불필요한 인스턴스 생성을 줄일 수 있습니다.

기억해두면 좋습니다. 🍀