728x90
반응형
추상 팩토리(Abstract Factory) 패턴
정의:
추상 팩토리 패턴은 서로 연관된, 또는 의존하는 객체들을 생성하기 위한 인터페이스를 제공하며, 각각의 구체적인 팩토리 클래스가 이를 구현하여 객체를 생성하는 디자인 패턴입니다. 이 패턴은 팩토리 메서드 패턴을 조합하여 여러 제품군을 생성하도록 설계되어 있습니다.
장점:
- 유연성과 확장성: 새로운 제품군을 도입하거나 기존 제품군을 확장하기가 용이합니다.
- 제품군 간의 일관성: 추상 팩토리는 연관된 제품들을 생성하므로, 이들이 함께 사용될 때 일관성을 유지할 수 있습니다.
- 클라이언트 코드 단순화: 클라이언트는 구체적인 클래스 이름을 알 필요 없이 팩토리를 통해 객체를 생성할 수 있습니다.
단점:
- 복잡성 증가: 새로운 제품이나 팩토리를 추가할 때마다 클래스 계통이 복잡해질 수 있습니다.
- 단일 책임 원칙 위배 가능성: 팩토리가 너무 많은 책임을 갖게 되어 단일 책임 원칙을 위배할 수 있습니다.
언제 사용하는지:
- 제품군을 일괄적으로 생성할 때: 관련된 여러 제품군을 한 번에 생성해야 하는 경우에 사용합니다.
- 제품군을 변경 가능한 경우: 서로 다른 제품군을 사용하고자 할 때 사용합니다.
- 제품군 간의 일관성이 중요한 경우: 여러 제품들이 함께 사용될 때 일관성이 유지되어야 하는 상황에서 사용합니다.
예시
// AbstractProductA: 제품군의 추상 클래스 또는 인터페이스
interface Window {
void display();
}
// ConcreteProductA1: 실제로 생성될 제품 클래스
class WindowsXPWindow implements Window {
@Override
public void display() {
System.out.println("Windows XP 창을 표시합니다.");
}
}
// ConcreteProductA2: 다른 제품 클래스
class Windows10Window implements Window {
@Override
public void display() {
System.out.println("Windows 10 창을 표시합니다.");
}
}
// AbstractProductB: 다른 제품군의 추상 클래스 또는 인터페이스
interface Button {
void click();
}
// ConcreteProductB1: 실제로 생성될 다른 제품 클래스
class WindowsXPButton implements Button {
@Override
public void click() {
System.out.println("Windows XP 버튼을 클릭했습니다.");
}
}
// ConcreteProductB2: 다른 제품 클래스
class Windows10Button implements Button {
@Override
public void click() {
System.out.println("Windows 10 버튼을 클릭했습니다.");
}
}
// AbstractFactory: 제품을 생성하는 인터페이스
interface GUIFactory {
Window createWindow();
Button createButton();
}
// ConcreteFactory1: 실제로 제품을 생성하는 클래스
class WindowsFactory implements GUIFactory {
@Override
public Window createWindow() {
return new Windows10Window();
}
@Override
public Button createButton() {
return new Windows10Button();
}
}
// ConcreteFactory2: 다른 제품을 생성하는 클래스
class WindowsXPFactory implements GUIFactory {
@Override
public Window createWindow() {
return new WindowsXPWindow();
}
@Override
public Button createButton() {
return new WindowsXPButton();
}
}
// Client: 팩토리를 사용하는 클라이언트 코드
public class AbstractFactoryExample {
public static void main(String[] args) {
// Windows 10 제품군을 생성하는 팩토리
GUIFactory windowsFactory = new WindowsFactory();
Window windows10Window = windowsFactory.createWindow();
Button windows10Button = windowsFactory.createButton();
windows10Window.display(); // 출력: Windows 10 창을 표시합니다.
windows10Button.click(); // 출력: Windows 10 버튼을 클릭했습니다.
// Windows XP 제품군을 생성하는 팩토리
GUIFactory windowsXPFactory = new WindowsXPFactory();
Window windowsXPWindow = windowsXPFactory.createWindow();
Button windowsXPButton = windowsXPFactory.createButton();
windowsXPWindow.display(); // 출력: Windows XP 창을 표시합니다.
windowsXPButton.click(); // 출력: Windows XP 버튼을 클릭했습니다.
}
}
이 예제에서는 GUIFactory 인터페이스가 추상 팩토리를 정의하고, WindowsFactory와 WindowsXPFactory 클래스가 이를 구현하여 Windows 10과 Windows XP 제품군을 생성합니다. 클라이언트 코드에서는 필요한 팩토리를 선택하고 해당 팩토리의 createWindow() 및 createButton() 메서드를 사용하여 객체를 생성합니다.
728x90
반응형
'개발 > 자바' 카테고리의 다른 글
[java] 데코레이터(Decorator) 패턴 (0) | 2024.01.11 |
---|---|
[java] 어댑터(Adapter) 패턴 (0) | 2024.01.11 |
[자바] 팩토리 메서드(Factory Method) 패턴 (1) | 2024.01.10 |
[java] 싱글턴(Singleton) 패턴 설명 및 코드 (0) | 2024.01.09 |
디자인 패턴 정의 및 종류 (0) | 2024.01.09 |