STUDY/CS

[디자인 패턴] 팩토리 패턴 (Factory Pattern) - 팩토리 메소드, 추상 팩토리 / 자바스크립트

ez1n 2023. 1. 8. 01:05

팩토리 패턴 (Factory Pattern)

객체 생성 부분을 분리하여 추상화한 패턴

 

  • 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위클래스에서 객체 생성에 관한 구체적인 내용 결정
  • 객체들 간 의존관계 분리하기 위함
  • 팩토리 메소드 패턴, 추상 팩토리 패턴

 

장점

  1. 상 / 하위 클래스를 분리하여 결합도를 감소시키고 유지 보수성을 증가시킨다.
  2. 유연성 및 확장성 증가

단점

  1. 객체 생성 시 새로운 클래스 필요

 

# 팩토리 메소드 패턴 (Factory Method Pattern)

  • 객체 생성 처리를 서브 클래스로 분리하여 처리하도록 캡슐화하는 패턴
  • 추상화를 통해 상위 클래스를 제공하고, 상세한 구현은 하위 클래스로 위임
  • 비슷한 객체를 반복적으로 생성새야 하는 경우 사용

예제

class Coffee {
  constructor(coffee) {
    this.name = coffee.name;
  }

  createCoffee() {
    return `${this.name}가 제조되었습니다.`;
  }
}

class Latte extends Coffee {
  constructor() {
    super({ name: "라떼" });
  }
}

class Espresso extends Coffee {
  constructor() {
    super({ name: "에스프레소" });
  }
}

class CoffeeFactory {
  static createCoffee(name) {
    switch (name) {
      case "Latte":
        return new Latte();
      case "Espresso":
        return new Espresso();
    }
  }
}

class Client {
  static createCoffee(name) {
    const factory = CoffeeFactory.createCoffee(name);
    return factory;
  }
}

const latte = Client.createCoffee("Latte");
const espresso = Client.createCoffee("Espresso");

console.log(latte, espresso); // Latte { name: '라떼' } Espresso { name: '에스프레소' }
console.log(latte.createCoffee()) // 라떼가 제조되었습니다.

 

  • Client 에서 createCoffee() 메소드 내의 변화는 신경 쓸 필요 없음 → 결합이 느슨해짐
  • 다른 커피를 주문하고 싶다면 새로운 팩토리(Class)를 정의하고 호출하는 부분만 변경
  • 객체를 동적으로 생성하는 메소드를 static으로 정의 → 메모리 절약

 

# 추상 팩토리 패턴 (Abstract Factory Pattern)

  • 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스 제공하는 패턴
  • 연관된 서브 클래스를 그룹화 (관련성 있는 여러 종류의 객체를 일관된 방식으로 생성할 때 유용)
  • 새로운 종류의 제품을 추가하는 경우 그룹으로 분리된 모든 클래스에 관련된 코드를 삽입해야함

→ 서브 객체를 추가하는 것이 어려움 (모든 서브 클래스 동시에 변경)

 

차이점

팩토리 메소드의 경우 단일 그룹으로 제한되지만 추상 팩토리의 경우 그룹화하여 객체를 생성할 수 있다.