디자인패턴

Factory Method Pattern - 팩토리 메서드 패턴

빈코더 2024. 12. 28. 11:17
728x90

Factory Method Pattern - 팩토리 메서드 패턴

Factory Method란?

팩토리 메서드 패턴(Factory Method Pattern)은 객체 생성의 책임을 서브클래스에 위임하여, 클라이언트 코드가 구체적인 클래스에 의존하지 않고 객체를 생성할 수 있도록 하는 생성 패턴(Creational Pattern) 중 하나입니다.

클라이언트에서 직접 new 연산자를 통해 제품 객체를 생성하는 것이 아닌, 제품 객체들을 도맡아 생성하는 공장 클래스를 만들고, 이를 상속하는 서브 공장 클래스의 메서드에서 여러가지 제품 객체 생성을 각각 책임 지게합니다.

또한 객체 생성에 필요한 과정을 템플릿 처럼 미리 구성해놓고, 객체 생성에 관한 전처리나 후처리를 통해 생성 과정을 다양하게 처리하여 객체를 유연하게 정할 수 있는 특징도 있습니다.

앞서 설명드렸던 Abstract Factory Pattern와 함께 적절한 상황에 사용하면 좋은 패턴입니다.

위 링크를 참고하셔도 좋지만 다시한번 비교를 해보면 아래와 같이 확인할 수 있습니다.

팩토리 메서드 패턴과 추상 팩토리 패턴의 차이점과 확장된 점

  • 팩토리 메서드 패턴
    • 객체를 생성할 때 단일 제품에 대해 팩토리 메서드를 제공합니다.
    • 하나의 팩토리 메서드가 특정 제품의 객체를 생성합니다.
  • 추상 팩토리 패턴
    • 여러 제품군에 대한 객체를 생성할 수 있는 팩토리 제공합니다.
    • 여러 개의 팩토리 메서드를 묶어서 제품군을 생성합니다.

팩토리 메서드는 하나의 객체를 생성하여 사용하는데 특화되어 있으며 객체 생성 과정을 캡슐화하여 코드의 유연성과 확장성을 높이는 패턴입니다.

팩토리 메서드 예제

  // Product 인터페이스
  interface Shape {
      fun draw()
  }

  // Concrete Product 클래스들
  class Circle : Shape {
      override fun draw() {
          println("Drawing a Circle")
      }
  }

  class Square : Shape {
      override fun draw() {
          println("Drawing a Square")
      }
  }

  // Creator 추상 클래스
  abstract class ShapeFactory {
      // 팩토리 메서드
      abstract fun createShape(): Shape

      // 객체 생성 및 사용
      fun render() {
          val shape = createShape()
          shape.draw()
      }
  }

  // Concrete Creator 클래스들
  class CircleFactory : ShapeFactory() {
      override fun createShape(): Shape {
          return Circle()
      }
  }

  class SquareFactory : ShapeFactory() {
      override fun createShape(): Shape {
          return Square()
      }
  }

  // 클라이언트 코드
  fun main() {
      val circleFactory = CircleFactory()
      circleFactory.render() // Output: Drawing a Circle

      val squareFactory = SquareFactory()
      squareFactory.render() // Output: Drawing a Square
  }

팩토리 메서드의 핵심 개념

  1. Product(제품): 팩토리 메서드가 생성하는 객체의 타입을 나타내는 인터페이스 또는 추상 클래스입니다.
  2. Concrete Product(구체 제품): 실제로 생성될 객체를 구현한 클래스입니다.
  3. Creator(생성자): 팩토리 메서드를 선언하는 클래스입니다.
  4. Concrete Creator(구체 생성자): 팩토리 메서드를 오버라이드하여 구체 제품 객체를 생성하는 클래스입니다.

팩토리 메서드의 구조

  1. Creator(생성자): 객체를 생성하는 팩토리 메서드를 선언합니다.
  2. Concrete Creator(구체 생성자): 팩토리 메서드를 구현하여 구체적인 제품 객체를 생성합니다.
  3. Product(제품): 생성될 객체의 인터페이스나 추상 클래스를 정의합니다.
  4. Concrete Product(구체 제품): Product 인터페이스를 구현하는 구체적인 클래스입니다.

팩토리 메서드의 장단점

  1. 장점
    • 유연한 객체 생성: 클라이언트 코드가 구체적인 클래스에 의존하지 않기 때문에 객체 생성 시 유연성이 높아집니다.
    • 확장성: 새로운 제품이 추가되더라도 기존 코드를 수정하지 않고 확장할 수 있습니다.
    • 단일 책임 원칙(SRP): 객체 생성의 책임을 분리하여 코드의 가독성과 유지보수성을 높입니다.
  2. 단점
    • 복잡성 증가: 클래스와 서브클래스가 늘어나 코드의 구조가 복잡해질 수 있습니다.
    • 추가 구현 비용: 새로운 제품과 생성자를 추가해야 하므로 초기 설계 및 구현에 시간이 필요합니다.

결론

팩토리 메서드 패턴은 객체 생성의 책임을 서브클래스에 위임함으로써 코드의 유연성과 확장성을 높여줍니다. 그러나 클래스 구조가 복잡해질 수 있으므로, 필요에 따라 적절하게 사용하는 것이 중요합니다.

728x90

'디자인패턴' 카테고리의 다른 글

Stractegy Pattern - 전략 패턴  (1) 2024.12.28
State Pattern(상태 패턴)  (0) 2024.12.19
Abstract Factory Pattern(추상 팩토리)  (2) 2024.12.17
Builder Pattern(빌더 패턴)  (0) 2024.12.16
Adapter Pattern(어댑터 패턴)  (2) 2024.12.11