[SW공학 | 디자인패턴] 8. 추상 팩토리 패턴 (Abstract Factory Pattern)
🏭 [SW공학 | 디자인패턴] 8. 추상 팩토리 패턴 (Abstract Factory Pattern)
목차
- 추상 팩토리 패턴 개요
- 추상 팩토리 패턴의 필요성
- 추상 팩토리 패턴의 구조
- 추상 팩토리 패턴 예제
- 추상 팩토리 패턴의 장점과 단점
- 마무리
추상 팩토리 패턴 개요
안녕하세요! 오늘은 구체적인 제품의 생성 책임을 팩토리 계층으로 분리하여 다양한 제품군을 쉽게 생성할 수 있는 추상 팩토리 패턴(Abstract Factory Pattern)에 대해 알아보겠습니다. 추상 팩토리 패턴은 생성 패턴(Creational Pattern) 중 하나로, 구체적인 클래스에 의존하지 않고 연관된 객체들의 제품군을 생성할 수 있도록 해줍니다.
추상 팩토리 패턴은 객체 생성의 책임을 개별 팩토리 클래스로 분리하여, 상위 인터페이스를 통해 다양한 객체를 생성할 수 있도록 합니다. 이를 통해 코드의 확장성과 유연성을 크게 높일 수 있습니다.
추상 팩토리 패턴의 필요성
추상 팩토리 패턴은 상호 의존적인 객체의 생성이 필요한 경우 매우 유용합니다. 예를 들어, 윈도우와 MacOS에서 서로 다른 UI 요소(Button, TextBox 등)를 생성해야 할 때, 추상 팩토리 패턴을 사용하면 하나의 인터페이스를 통해 각각의 환경에 맞는 UI 제품군을 쉽게 생성할 수 있습니다.
즉, 구체적인 클래스에 의존하지 않고, 다양한 제품군을 쉽게 교체하고 확장할 수 있도록 지원하여 코드의 결합도를 낮추고 유연성을 높이는 데 큰 도움이 됩니다.
추상 팩토리 패턴의 구조
추상 팩토리 패턴은 AbstractFactory (추상 팩토리), ConcreteFactory (구체적인 팩토리), AbstractProduct (제품 인터페이스), ConcreteProduct (구체적인 제품) 네 가지 주요 요소로 구성됩니다.
- AbstractFactory (추상 팩토리)
- 제품군을 생성하기 위한 추상 인터페이스를 정의합니다. 각 제품군에 대해 팩토리 메서드를 선언합니다.
- ConcreteFactory (구체적인 팩토리)
- AbstractFactory를 구현하여 구체적인 제품을 생성하는 역할을 합니다. 각 제품군의 구체적인 팩토리 클래스가 각기 다른 환경에 맞는 제품 객체를 생성합니다.
- AbstractProduct (제품 인터페이스)
- 각 제품이 가져야 할 공통 인터페이스를 정의합니다. 예를 들어, 버튼이나 체크박스와 같은 UI 요소들이 이 인터페이스를 구현합니다.
- ConcreteProduct (구체적인 제품)
- AbstractProduct를 구현하여 실제 제품을 생성합니다. 각 환경에 맞는 구체적인 제품 클래스들이 존재합니다.
추상 팩토리 패턴 예제
아래는 추상 팩토리 패턴을 사용하여 Windows와 MacOS에서 서로 다른 UI 요소(Button, Checkbox)를 생성하는 예제입니다.
// AbstractProduct 1: Button 인터페이스
interface Button {
void render();
}
// ConcreteProduct 1-1: Windows 스타일 버튼
class WindowsButton implements Button {
public void render() {
System.out.println("윈도우 스타일 버튼 렌더링");
}
}
// ConcreteProduct 1-2: MacOS 스타일 버튼
class MacOSButton implements Button {
public void render() {
System.out.println("MacOS 스타일 버튼 렌더링");
}
}
// AbstractProduct 2: Checkbox 인터페이스
interface Checkbox {
void render();
}
// ConcreteProduct 2-1: Windows 스타일 체크박스
class WindowsCheckbox implements Checkbox {
public void render() {
System.out.println("윈도우 스타일 체크박스 렌더링");
}
}
// ConcreteProduct 2-2: MacOS 스타일 체크박스
class MacOSCheckbox implements Checkbox {
public void render() {
System.out.println("MacOS 스타일 체크박스 렌더링");
}
}
// AbstractFactory: GUIFactory 인터페이스
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
// ConcreteFactory 1: Windows용 GUI 팩토리
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
// ConcreteFactory 2: MacOS용 GUI 팩토리
class MacOSFactory implements GUIFactory {
public Button createButton() {
return new MacOSButton();
}
public Checkbox createCheckbox() {
return new MacOSCheckbox();
}
}
// 클라이언트 코드
public class AbstractFactoryExample {
public static void main(String[] args) {
GUIFactory factory;
// 윈도우 환경에서 GUI 요소 생성
factory = new WindowsFactory();
Button winButton = factory.createButton();
Checkbox winCheckbox = factory.createCheckbox();
winButton.render();
winCheckbox.render();
// MacOS 환경에서 GUI 요소 생성
factory = new MacOSFactory();
Button macButton = factory.createButton();
Checkbox macCheckbox = factory.createCheckbox();
macButton.render();
macCheckbox.render();
}
}
출력 결과
윈도우 스타일 버튼 렌더링
윈도우 스타일 체크박스 렌더링
MacOS 스타일 버튼 렌더링
MacOS 스타일 체크박스 렌더링
예제 설명
- Button 인터페이스와 Checkbox 인터페이스 (AbstractProduct): 각 제품군에 대한 공통 인터페이스입니다.
- ConcreteProduct: WindowsButton, MacOSButton, WindowsCheckbox, MacOSCheckbox는 각 운영 체제에 맞게 UI 요소를 생성합니다.
- GUIFactory 인터페이스 (AbstractFactory): createButton()과 createCheckbox() 메서드를 선언하며, 각 운영 체제에 맞는 제품을 생성하는 역할을 합니다.
- WindowsFactory와 MacOSFactory (ConcreteFactory): GUIFactory를 구현하여 윈도우와 MacOS에 맞는 제품을 생성합니다.
팩토리 메서드 패턴과 추상 팩토리 패턴의 차이점
- 객체 생성의 초점
- 팩토리 메서드 패턴: 하나의 객체를 생성하는 데 중점을 두며, 구체적인 객체 생성을 서브클래스에서 결정합니다.
- 추상 팩토리 패턴: 여러 관련 객체들을 묶음(제품군)으로 생성하는 데 중점을 둡니다. 각 제품군은 공통 인터페이스를 통해 생성되므로, 구체적인 클래스에 의존하지 않고 다양한 객체들을 생성할 수 있습니다.
- 적용 상황
- 팩토리 메서드 패턴: 구체적인 클래스에 의존하지 않고 단일 객체 생성에 중점을 두는 상황에 유용합니다.
- 추상 팩토리 패턴: 상호 관련된 다양한 객체들이 일관된 방식으로 생성되어야 할 때 적합합니다. 예를 들어, UI 요소를 플랫폼에 맞게 통합할 때 유용합니다.
- 확장성
- 팩토리 메서드 패턴: 새로운 제품을 추가하려면 서브클래스를 추가하거나 기존 팩토리 메서드를 확장하면 됩니다.
- 추상 팩토리 패턴: 새 제품군을 추가하려면 새로운 추상 팩토리와 그에 따른 구체적인 팩토리 클래스들을 추가해야 하므로 상대적으로 더 복잡할 수 있습니다.
추상 팩토리 패턴의 장점과 단점
장점
- 일관된 제품군 생성: 팩토리를 통해 일관된 제품군을 생성할 수 있어, 여러 객체가 서로 잘 어우러지는 환경을 제공합니다.
- 확장성: 새로운 제품군이 추가될 때 팩토리 클래스만 추가하면 되므로 코드 확장이 용이합니다.
- 코드 유연성: 클라이언트 코드에서 구체적인 클래스에 의존하지 않고 인터페이스만 참조하기 때문에 높은 유연성을 제공합니다.
단점
- 복잡성 증가: 클래스가 많아져 코드 구조가 다소 복잡해질 수 있습니다.
- 제품군 확장 시 제한: 새 인터페이스가 추가될 경우 모든 팩토리를 수정해야 할 수 있습니다.
마무리
추상 팩토리 패턴은 다양한 제품군을 일관되게 생성하고, 구체적인 클래스에 의존하지 않으면서 객체를 생성할 수 있도록 해줍니다. 이 패턴을 통해 코드 확장성을 높이고, 환경에 따라 유연하게 객체를 생성할 수 있는 방법을 설계해보세요! 🏭