본문 바로가기
Web Development/Design Patterns

[Design Patterns] 생성 패턴(Creational Patterns) | 팩토리 메서드 (Factory Method) 패턴

by Krystal K 2023. 12. 11.

생성 패턴(Creational Patterns) | 팩토리 메서드 (Factory Method) 패턴 

[index]
1. 팩토리 메서드 (Factory Method) 패턴이란?
2. 팩토리 메서드 패턴의 장점
3. 팩토리 메서드 패턴의 단점
4. 팩토리 메서드 패턴 적용 예시
5. 마무리


+ 디자인 패턴이 무엇인지 모른다면?
https://reveur1996.tistory.com/149

[디자인 패턴] 디자인 패턴이란?

디자인 패턴이란? 1. 디자인 패턴이란? 2. 디자인 패턴 구조 3. 왜 디자인 패턴을 알아야할까? 4. 디자인 패턴에 대한 부정적인 시각 5. 디자인 패턴의 분류 6.마무리 1. 디자인 패턴이란? 패턴은 알

reveur1996.tistory.com

 

1. 팩토리 메서드 (Factory Method) 패턴이란?

팩토리 메서드 (Factory Method) 패턴이란 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴입니다. 객체 생성을 처리하는 인터페이스를 정의하지만, 서브클래스에서 어떤 클래스의 인스턴스를 생성할지 결정하도록 하는 패턴입니다. 이러한 패턴은 객체 생성의 책임을 클라이언트 코드로부터 분리하고, 구체적인 생성 로직을 서브클래스에 위임하여 객체 생성의 유연성을 높이는 데 사용됩니다. 상위 클래스와 하위 클래스가 분리되기 때문에 더 많은 유연성을 가지고 객체 생성 로직이 분리되어 있기 때문에 유지 보수성이 증가합니다. 
 
팩토리 메소드의 주요 목표는 확장성입니다. 팩토리 메소드는 관리, 유지, 관리하는 애플리케이션에서 자주 사용됩니다. 또는 서로 다르지만 동시에 많은 특성(예: 메서드 및 속성)을 공통적으로 갖는 개체 컬렉션을 조작합니다. 예를 들어 Xml 문서, PDF 문서 및 Rtf 문서가 혼합된 문서 모음이 있습니다.
 

팩토리 메서드 패턴의 활용

  • 객체 생성이 하위 클래스에게 위임되어야 할 때
  • 객체 생성이 변할 가능성이 있으며, 이에 대비해야 할 때
  • 객체 생성 로직을 클라이언트 코드로부터 분리하고자 할 때

 

2. 팩토리 메서드 패턴의 장점

  1. 유연성과 확장성
    팩토리 메서드 패턴은 객체 생성에 대한 책임을 서브클래스로 이동시킴으로써 유연성을 제공합니다. 새로운 제품이나 서비스가 추가되어도 해당 서브클래스만 확장하면 되므로 기존 코드에 영향을 덜 주고 확장이 용이합니다.

  2. 클라이언트 코드의 단순화
    팩토리 메서드 패턴을 사용하면 클라이언트 코드에서는 구체적인 제품의 클래스를 명시적으로 참조하지 않아도 됩니다. Creator 클래스의 팩토리 메서드를 호출함으로써 객체를 생성하므로, 클라이언트 코드는 인터페이스나 추상 클래스에만 의존하게 됩니다.

  3. 코드 중복 최소화
    팩토리 메서드 패턴을 사용하면 객체 생성에 필요한 코드를 한 곳에 모으기 때문에 코드 중복이 최소화됩니다. 이로 인해 유지보수가 더 쉬워집니다.

  4. 의존성 역전 원칙(Dependency Inversion Principle) 적용
    팩토리 메서드 패턴은 의존성 역전 원칙을 따르며, 추상화에 의존하도록 하여 상위 수준 모듈이 하위 수준 모듈에 의존하지 않게 합니다.

  5. 객체의 생성과 사용을 분리
    팩토리 메서드 패턴을 사용하면 객체의 생성과 사용이 분리되어 있습니다. 이는 객체 생성에 대한 변경이나 확장이 사용 코드에 미치는 영향을 최소화합니다.

 

3. 팩토리 메서드 패턴의 단점

  1. 간단한 사례의 복잡성
    팩토리 메서드 패턴은 객체 생성에 대한 추상화를 제공하기 때문에, 객체 생성 로직이 간단한 경우에는 불필요한 복잡성을 초래할 수 있습니다. 직접 객체를 생성하는 것이 더 간단하고 직관적인 경우가 있을 수 있습니다.

  2. 잠재적인 성능 오버헤드
    팩토리 메서드 패턴은 추가 함수 호출 및 조회 작업으로 인해 성능 오버헤드가 발생할 수 있습니다. 그러나 대부분의 경우 이러한 오버헤드는 무시할 수 있는 수준입니다.

  3. 러닝커브와 가독성
    팩토리 메서드 패턴을 처음 사용하는 경우, 각 기능의 역할 및 공장에서 객체를 생성하는 방법을 이해하는 데 시간이 걸릴 수 있습니다. 이는 처음에는 코드의 가독성을 저해할 수 있습니다.

  4. 외부 구성에 대한 종속성
    팩토리 메서드 패턴은 외부 구성에 의존하여 객체 생성을 결정합니다. 이 구성이 변경되거나 부적절한 경우 예기치 않은 동작이 발생할 수 있습니다.

  5. 과용 가능성
    팩토리 메서드 패턴을 지나치게 사용하면 코드가 복잡해지고 이해하기 어려워질 수 있습니다. 패턴을 적절하게 사용하고 이점을 명확히 이해하는 것이 중요합니다.

  6. 잘못된 유형의 문제에 적용
    팩토리 메서드 패턴은 객체 생성을 위한 인터페이스를 제공하지 않는 한, 불필요하게 복잡성을 초래할 수 있습니다. 애플리케이션의 목표와 디

단점을 보완하는 방법 | 외부 구성의 안정성 보장

외부 구성에 대한 종속성을 최소화하고 안정성을 보장하기 위해 설정이나 구성 정보에 대한 검증 로직을 도입할 수 있습니다. 잘못된 구성이 주어진 경우를 대비하여 예외 처리 등을 추가할 수 있습니다.
 

4. 팩토리 메서드 패턴 적용 예시

// Creator 클래스
class Creator {
  createProduct() {
    // 팩토리 메서드, 하위 클래스에서 구현됨
  }

  operate() {
    const product = this.createProduct();
    // product를 사용하여 작업 수행
    console.log(product.operation());
  }
}

// ConcreteCreator 클래스
class ConcreteCreator extends Creator {
  createProduct() {
    return new ConcreteProduct();
  }
}

// Product 클래스
class Product {
  operation() {
    // 제품의 동작 정의
  }
}

// ConcreteProduct 클래스
class ConcreteProduct extends Product {
  operation() {
    return 'ConcreteProduct의 동작';
  }
}

// 사용 예시
const creator = new ConcreteCreator();
creator.operate(); // ConcreteProduct의 동작 출력

 

5. 마무리

 
팩토리 메서드 패턴은 객체 생성을 캡슐화하여 코드의 유지보수성과 확장성을 향상시킵니다. 하지만 모든 디자인 패턴과 마찬가지로 팩토리 메서드 패턴은 적절한 상황에서 적용하는 것이 중요합니다. 유연성과 확장성을 갖춘 객체 지향 소프트웨어 디자인을 위해 팩토리 메서드 패턴은 훌륭한 도구입니다. 객체 생성 로직을 캡슐화하여 시스템의 일부를 변경하고자 할 때, 팩토리 메서드 패턴은 이를 용이하게 만들어줍니다. 하지만 지나치게 사용하거나 간단한 상황에서 사용할 경우에는 오히려 코드를 더 복잡하게 만들 수 있습니다. 실제로 필요한 경우에 팩토리 메서드 패턴을 도입하고, 코드의 가독성과 유지보수성을 고려하는 것이 좋습니다.
 


참고 문헌
https://dev.to/jsmanifest/the-power-of-factory-design-pattern-in-javascript-2bf8
https://dev.to/jsmanifest/the-power-of-factory-design-pattern-in-javascript-2bf8
https://www.geeksforgeeks.org/factory-method-in-javascript-design-pattern/#advantages-of-factory-method-in-javascript-design-pattern
https://medium.com/@thebabscraig/javascript-design-patterns-part-1-the-factory-pattern-5f135e881192
https://www.oreilly.com/library/view/learning-javascript-design/9781449334840/ch09s10.html
https://itnext.io/4-ways-to-implement-factory-pattern-in-javascript-2e019c2a9ada
https://www.dofactory.com/javascript/design-patterns/factory-method

728x90