개요
팩토리 메서드 패턴(Factory Method Pattern)은 객체 생성을 처리하기 위한 디자인 패턴 중 하나입니다. 객체를 생성하는 과정에서 유연성을 확보하기 위해 사용됩니다.
팩토리 메서드란?
팩토리 메서드는 객체 생성 처리를 서브 클래스로 분리하여 처리합니다. 이를 통해 객체 생성 과정을 수정하지 않고 새로운 객체를 추가하는 것이 가능합니다. 즉, 객체 생성에 대한 책임을 서브 클래스로 위임하여 객체 생성 과정을 다양화할 수 있습니다.
팩토리 메서드 패턴의 구성 요소
classDiagram class Creator{ +factoryMethod(): Product } class ConcreteCreator{ +factoryMethod(): Product } class Product{ +operation() } class ConcreteProduct{ +operation() } Creator <|-- ConcreteCreator Product <|.. ConcreteProduct Creator --> Product : <<create>> ConcreteCreator --> ConcreteProduct : <<create>>
Mermaid
복사
•
Creator: 객체 생성을 위한 팩토리 메서드를 선언하는 인터페이스입니다. Creator는 객체 생성을 위한 추상 메서드를 선언합니다.
예제
•
ConcreteCreator: 구체적인 객체 생성 방법을 구현합니다. Creator 인터페이스를 구현하여 객체를 생성합니다.
예제
•
Product: 팩토리 메서드 패턴으로 생성되는 객체의 추상화입니다. Creator는 Product를 생성합니다.
예제
•
ConcreteProduct: 구체적인 Product를 생성합니다. ConcreteCreator에서 Product를 생성합니다.
예제
팩토리 메서드 패턴의 사용성
팩토리 메서드 패턴은 객체 생성 과정을 일반화하여 유연성을 높이기 위해 사용됩니다. 예를 들어, 클래스 간의 결합도를 낮추는 데 도움이 됩니다. 객체 생성을 위한 코드를 서브 클래스로 분리하여 유지보수성을 높이는 효과도 있습니다.
사용 예
1.
Java의 Collection Framework
Java의 Collection Framework는 팩토리 메서드 패턴을 사용하여 객체 생성을 추상화합니다. Collection 인터페이스는 객체를 생성하는데 사용되는 팩토리 메서드를 정의하고 있으며, 구체적인 Collection 클래스는 이 팩토리 메서드를 구현하여 구체적인 Collection 객체를 생성합니다.
2.
Spring Framework의 Bean Factory
Spring Framework는 객체 생성을 추상화하기 위해 팩토리 메서드 패턴을 사용합니다. Spring의 Bean Factory는 객체 생성을 추상화하는 인터페이스를 제공하고, 구체적인 Bean Factory 클래스는 이 인터페이스를 구현하여 객체를 생성합니다.
3.
Logging Framework의 LoggerFactory
Logging Framework는 팩토리 메서드 패턴을 사용하여 로그 객체를 생성합니다. LoggerFactory 클래스는 getLogger() 메서드를 제공하며, 이 메서드는 로그 객체를 생성합니다. 구체적인 로그 객체는 LoggerFactory를 상속받아 getLogger() 메서드를 구현하여 생성합니다.
4.
GUI Framework의 Widget Factory
GUI Framework는 팩토리 메서드 패턴을 사용하여 위젯 객체를 생성합니다. Widget Factory 클래스는 추상적인 createWidget() 메서드를 가지고 있으며, 구체적인 위젯 객체는 Widget Factory를 상속받아 createWidget() 메서드를 구현하여 생성합니다.
다른 디자인 패턴과의 관계
추상 팩토리 패턴
classDiagram class AbstractFactory{ +createProduct() } class ConcreteFactory1{ +createProduct() } class ConcreteFactory2{ +createProduct() } class AbstractProduct{ +operation() } class ConcreteProduct1{ +operation() } class ConcreteProduct2{ +operation() } AbstractFactory <|.. ConcreteFactory1 AbstractFactory <|.. ConcreteFactory2 AbstractProduct <|.. ConcreteProduct1 AbstractProduct <|.. ConcreteProduct2
Mermaid
복사
템플릿 메서드 패턴
classDiagram class AbstractClass{ +templateMethod() -primitiveOperation1() -primitiveOperation2() } class ConcreteClass{ +templateMethod() -primitiveOperation1() -primitiveOperation2() } AbstractClass <|-- ConcreteClass
Mermaid
복사
전략 패턴
classDiagram class Context{ +setStrategy() +executeStrategy() } class Strategy{ +execute } class ConcreteStrategyA{ +execute() } class ConcreteStrategyB{ +execute() } Context *-- Strategy Context --> ConcreteStrategyA Context --> ConcreteStrategyB
Mermaid
복사