디자인패턴

디자인패턴 - 팩토리 패턴

traveler_JH 2024. 12. 12. 21:12

 

팩토리 패턴(Factory Pattern)

  • 객체 생성 로직을 캡슐화 하여 클래스의 인스턴스를 생성하는 책임을 팩토리라는 별도의 클래스 또는 매서드로 분리하는 디자인 패턴
  • 객체를 사용하는코드(client)에서 객체 생성부분을 떼어내 추상화한 패턴이자 상속관계에 있는 두 클래스(product)에서 상위 클래스(factory)가 중요한 뼈대를 결정하고 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴
  • 상위 클래스와 하위 클래스가 분리 되기때문에 느슨한 결합을 가지며 상위클래스에서는 인스턴스 생성방식에 대해 알필요가 없어서 많은 유연성을 가진다.
  • 즉, 객체를 직접 생성하는 대신, 팩토리 클래스나 매서드를 통해 객체를 생성 하여 객체 생성 과정을 유연하고 확장가능하게 만든다.

특징

  1. 객체 생성 로직의 캡슐화
    • 객체 생성 로직을 클라이언트 코드에서 분리하여 코드 유지보수를 용이하게 한다.
  2. 유연성
    • 생성할 객체의 종류가 변경되거나 확장될경우 클라이언트 코드를 수정하지 않아도 된다.
  3. 코드의 일관성
    • 객체 생성 과정이 통제되므로 코드의 일관성이 유지된다.

구조

  • 구성요소
    • 팩토리 (Factory)
      • 객체를 생성하는 매서드나 클래스를 제공
      • 어떤 객체를 생성할지 결정
    • 제품(Product)
      • 팩토리에서 생성된 객체
      • 일반적으로 인터페이스나 추상 클래스로 정의
    • 클라이언트(Client)
      • 팩토리를 사용해 객체를 생성하고 사용

구현 예제

// 추상 클래스(팩토리)(Product)
class Car {
    constructor(brand, speed) {
        this.brand = brand;
        this.speed = speed;
    }

    drive() {
        console.log(`${this.brand} is driving at ${this.speed} km/h`);
    }
}

//구체적인 팩토리(하위 클래스)(Factory)
class CarFactory {
    static createCar(type) {
        if (type === "sports") {
            return new Car("Ferrari", 300);
        } else if (type === "suv") {
            return new Car("Range Rover", 150);
        } else {
            return new Car("Toyota", 100);
        }
    }
}

// 클라이언트 코드
const sportsCar = CarFactory.createCar("sports");
sportsCar.drive(); // Ferrari is driving at 300 km/h

const suvCar = CarFactory.createCar("suv");
suvCar.drive(); // Range Rover is driving at 150 km/h
 

작동 방식

  • 클라이언트가 CarFactory.createCar("sports")를 호출:
    • type이 "sports"이므로 CarFactory는 Car("Ferrari", 300) 객체를 생성하여 반환.
  • 클라이언트가 sportsCar.drive() 호출:
    • 반환된 객체의 drive() 메서드를 호출하여 동작.
    • 결과: Ferrari is driving at 300 km/h
  • 클라이언트가 CarFactory.createCar("suv")를 호출:
    • type이 "suv"이므로 CarFactory는 Car("Range Rover", 150) 객체를 생성하여 반환.
  • 클라이언트가 suvCar.drive() 호출:
    • 반환된 객체의 drive() 메서드를 호출하여 동작.
    • 결과: Range Rover is driving at 150 km/h

팩토리 패턴의 장점

  1. 객체 생성의 유연성:
    • 팩토리 메서드에서 다양한 객체를 생성할 수 있다.
    • 예를 들어, 설정 파일이나 사용자 입력에 따라 동적으로 객체를 생성할 수 있다.
  2. 코드 유지보수성 향상:
    • 객체 생성 로직이 한 곳에 집중되므로 수정이 용이하다.
    • 클라이언트는 생성 로직을 알 필요가 없다.
  3. 확장성:
    • 새로운 객체 유형을 추가할 때, 클라이언트 코드를 수정하지 않아도 된다.

팩토리 패턴의 단점

  1. 복잡성 증가:
    • 단순한 프로그램에서는 불필요하게 설계를 복잡하게 만들 수 있습니다.
  2. 남용의 위험:
    • 모든 객체 생성을 팩토리로 처리하면 코드가 지나치게 분리되어 가독성이 떨어질 수 있습니다.

팩토리 패턴이 적합한 경우

  1. 객체 생성 로직이 복잡하거나 다양할 때:
    • 객체 생성 과정이 복잡하거나 다양한 입력에 따라 다른 객체를 생성해야 할 때.
  2. 객체 타입이 확장 가능해야 할 때:
    • 새로운 객체 유형을 추가하거나 기존 객체 유형을 교체할 가능성이 있을 때.
  3. 객체 생성과 사용을 분리하고 싶을 때:
    • 클라이언트 코드에서 객체 생성 과정을 분리하고 싶을 때.