Definition
팩토리 메소드 패턴(Factory Method Pattern)에서는 객체를 생성할 때 필요한 인터페이스를 만든다. 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정한다. 팩토리 메소드 패턴을 사용하면 클래스 인스턴스를 만드는 일을 서브클래스에게 맡기게 된다.
- Creational Patterns
사용하는 서브클래스에 따라 생산되는 객체 인스턴스가 결정된다.
Situation
- 피자 종류가 계속해서 추가되어 새로운 피자에 대한 if 문이 증가하고 new를 피자 클래스안에서 계속해서 처리 -> 객체 생성 코드를 Factory 클래스를 생성하여 이동시킴
- 클래스는 생성해야 하는 클래스를 알지 못함
- 서브클래스는 생성되어야 하는 객체를 지정할 수 있음
- 부모 클래스는 생성을 하위 클래스로 맡기길 원함
- 코드에서 작업해야 하는 객체의 정확한 유형과 종속성을 모르는 경우
◇ Factory Method는 제품 구성 코드와 실제로 제품을 사용하는 코드를 구분하여, 코드의 나머지 부분과 독립적으로 제품
구성 코드를 확장하는 것이 더 쉽다.
◇ 예를 들어 앱에 새 제품 유형을 추가하려면 새 생성자 하위 클래스를 만들고 그 안에 있는 팩토리 메서드를 재정의하기만 하면 된다.
- 라이브러리나 프레임워크의 사용자에게 내부 구성 요소를 확장하는 방법을 제공하려는 경우
- 매번 재구축하는 대신 기존 객체를 재사용하여 시스템 리소스를 절약하려는 경우
Structure
Pros
- Creator와 concrete product간의 긴밀한 결합을 피할 수 있다.
- 단일 책임 원칙. 제품 생성 코드를 프로그램의 한 위치로 이동하여 코드를 더 쉽게 지원할 수 있다.
- 개방/폐쇄 원칙. 기존 클라이언트 코드를 손상시키지 않고 새로운 유형의 제품을 프로그램에 도입할 수 있다.
Cons
- 패턴을 구현하기 위해 많은 새 하위 클래스를 도입해야 하므로 코드가 더 복잡해질 수 있다. 가장 좋은 시나리오는 생성자 클래스의 기존 계층 구조에 패턴을 도입할 때 이다.
비슷한 패턴
많은 디자인은 Factory Method(덜 복잡하고 하위 클래스를 통해 사용자 정의 가능)를 사용하여 시작하여 Abstract Factory, Prototype 또는 Builder(더 유연하지만 더 복잡함)로 발전한다.
Factory Method vs Abstract Factory
- Factory Method는 인스턴스화할 객체를 결정하기 위해 상속을 사용하는데 중점을 둔다.
- Abstract Factory는 인스턴스화를 다른 객체에 위임하는데 중점을 둔다.
- Abstract Factory 클래스는 종종 Factory Method 세트를 기반으로 하지만 Prototype을 사용하여 이러한 클래스의 메소드를 구성할 수도 있다.
Factory Method vs Prototype
- Prototype은 상속을 기반으로 하지 않으므로 단점이 없다. 반면에 Prototype은 복제된 객체의 복잡한 초기화가 필요하다.
- Factory Method는 상속을 기반으로 하지만 초기화 단계가 필요하지 않다.
Factory Method vs Template Method
- Factory Method는 Template Method의 특수화이다.
- 동시에 Factory Method는 큰 Template Method의 한단계 역할을 할 수 있다.
Dependency Inversion Principle
- 추상화에 의존한다. concreate 클래스에 의존하지 마라.
- 높은 수준의 구성 요소는 낮은 수준의 구성 요소에 의존해서는 안된다. 오히려 둘 다 추상화에 의존해야 한다.
- Factory Method는 DIP를 따르는 한 가지 방법이다.
With Iterator
Iterator와 함께 Factory Method를 사용하여 컬렉션 하위 클래스가 컬렉션과 호환되는 다양한 유형의 Iterator를 반환하도록 할 수 있다.
'Design Pattern' 카테고리의 다른 글
[Design Pattern] 싱글턴 패턴(Single Pattern)에 대해 알아보자 (1) | 2022.06.26 |
---|---|
[Design Pattern] 추상 팩토리 패턴(Abstract Factory Pattern)에 대해 알아보자 (0) | 2022.06.24 |
[Design Pattern] 데코레이터 패턴(Decorator Pattern)에 대해 알아보자 (0) | 2022.06.23 |
[Design Pattern] 옵저버 패턴(Observer Pattern)에 대해 알아보자 (0) | 2022.06.21 |
[Design Pattern] 전략 패턴(Strategy Pattern)에 대해 알아보자 (0) | 2022.06.20 |
댓글