[디자인 패턴] 팩토리 패턴

변진상·2024년 1월 16일
0

학습 기록

목록 보기
3/31

이 글은 면접을 위한 CS 전공지식노트의 책을 읽고 학습 후 스터디 공유를 위한 글입니다.

팩토리 패턴

팩토리 패턴이란?

  • 객체를 사용하는 코드에서 객체 생성부분을 떼어내 추상화한 패턴.
  • 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정 → 하위 클래스에서 객체 생성에 대한 구체적인 내용을 결정하는 패턴

패턴에 대한 비유

  • 하위 클래스 → 라떼 레시피, 아메리카노 레시피에 대한 구체적인 내용, 상위 클래스 → 바리스타 공장.
  • 하위 클래스인 레시피가 상위 클래스인 바리스타 공장에 전달 되어 레시피 대로 생산물이 나오는 공정을 생각하면 좋다.

구현 코드

class Latte {
  constructor() {
    this.name = "latte"
  }
}

class Espresso {
  constructor() {
    this.name = "espresso"
  }
}

class LatteFactory {
	// 하위 클래스 -> 구체적인 내용을결정
  static createCoffee() {
    return new Latte();
  }
}

class EspressoFactory {
	// 하위 클래스 -> 구체적인 내용을결정
  static createCoffee() {
    return new Espresso();
  }
}

const factoryList = { LatteFactory, EspressoFactory };
// const factoryList = { LatteFactory: LatteFactory, EspressoFactory: EspressoFactory };
// ES6의 단축 속성명(Shorthand property names).
// 객체의 속성 이름과 값이 동일하므로, 속성 이름과 값을 동일하게 처리합니다.

class CoffeeFactory {
	// 상위 클래스 -> 중요한 뼈대를 결정
  static createCoffee(type) {
    const factory = factoryList[type];
		// type에 따른 팩토리 선택
    return factory.createCoffee();
		// 선택된 팩토리에서 인스턴스 생성해서 가져와(주입해) 스태틱 메서드의 리턴 값이 된다.
  }
}

const coffee = CoffeeFactory.createCoffee("LatteFactory");
console.log(coffee.name)
  • CoffeeFactory라는 상위 클래스가 중요한 뼈대를 결정하고 하위 클래스인 LatteFactory가 구체적인 내용을 결정
  • 의존성 주입이라고도 할 수 있는데, CoffeeFactory에서 LatteFactory의 인스턴스를 생성하는 것이 아닌 LatteFactory에서 생성한 Latte 인스턴스를 CoffeeFactory에 주입하고 있기 때문이다.
  • 정적 메서드를 쓰면 클래스의 인스턴스 없이 호출이 가능하여 메모리를 절약할 수 있고 개별 인스턴스에 묶이지 않으며 클래스 내의 함수를 정의할 수 있는 장점이 있다.

팩토리 패턴의 장점

  • 유연성: 상, 하위 클래스가 분리되어 느슨한 결합을 가지며 상위 클래스에서 인스턴스 생성 방식에 대해 알 필요가 없기 때문에 더 많은 유연성을 가진다.
  • 유지 보수성 증가: 객체 생성 로직이 따로 떨어져 있어 리팩토링이 용이
  • 객체 생성의 추상화: 팩토리 패턴은 객체 생성 로직을 캡슐화하여 클라이언트가 구체적인 객체 생성에 대해 알 필요 없이 인터페이스를 통해 객체를 요청할 수 있다.
  • 객체 지향 프로그래밍(OOP, Object-Oriented Programming)-단일 책임 원칙 준수(SRP, single responsibility principle): 객체 생성 관련 코드를 팩토리에 위임함으로써, 클래스는 단일 책임을 가지게 되고 유지보수 및 확장이 쉬워진다.

팩토리 패턴의 단점

  • 복잡성 증가: 객체 생성을 위해 추가적인 클래스(팩토리 클래스)를 도입하는 것은 코드의 복잡성을 증가시킬 수 있다.
  • 클래스 수 증가: 많은 종류의 객체를 생성하기 위해 여러 개의 팩토리 클래스가 필요할 수 있으며, 이로 인해 클래스 수가 늘어날 수 있다.
  • 구현 오버헤드: 작은 규모의 애플리케이션에서는 객체 생성 로직을 별도의 클래스로 분리하는 것이 과도한 구현 오버헤드일 수 있다.

팩토리 패턴은 객체 생성의 관심사를 분리(SoC, separation of concern)하여 유연성과 유지보수성을 높이는 데 도움을 준다. 하지만 프로젝트의 규모와 구조에 따라 팩토리 패턴의 적합성을 고려해야 합니다.

profile
자신을 개발하는 개발자!

0개의 댓글