-
생성(Creational) - 추상 팩토리(Abstract Factory) 패턴Java/디자인패턴 2024. 11. 16. 16:23반응형
추상 팩토리(Abstract Factory) 패턴
추상 팩토리 패턴은 생성(Creational) 디자인 패턴에 속하며, 객체의 생성 로직을 클라이언트 코드와 분리하고, 관련된 객체들을 그룹화하여 일관된 방식으로 생성할 수 있도록 돕는 패턴입니다.
이 패턴은 팩토리 메서드 패턴의 확장판으로, 서로 연관된 객체들의 집합을 생성할 때 유용합니다. 이를 통해 클라이언트는 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 객체를 생성합니다.
특징
- 객체 생성 로직의 추상화: 클라이언트는 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 객체를 생성합니다.
- 일관성 보장: 같은 팩토리를 사용하여 생성된 객체들은 서로 호환성을 유지합니다.
- 확장성: 새로운 제품군을 쉽게 추가할 수 있습니다.
구성 요소
- 추상 팩토리(AbstractFactory): 팩토리의 인터페이스를 정의합니다. 관련된 객체들을 생성하는 메서드를 선언합니다.
- 구체 팩토리(ConcreteFactory): 추상 팩토리를 구현하여 실제 객체를 생성합니다.
- 추상 제품(AbstractProduct): 생성되는 제품들의 인터페이스를 정의합니다.
- 구체 제품(ConcreteProduct): 추상 제품을 구현하는 구체적인 클래스입니다.
- 클라이언트(Client): 추상 팩토리를 통해 객체를 생성하고 사용합니다.
Java로 Abstract Factory 예시
예제: GUI 툴킷
사용자가 운영체제(Windows 또는 Mac)에 따라 다른 스타일의 버튼과 체크박스를 생성하도록 설계합니다.
1. 추상 제품 정의
// 추상 제품: 버튼 interface Button { void render(); } // 추상 제품: 체크박스 interface Checkbox { void render(); }
2. 구체 제품 정의
// Windows 스타일 버튼 class WindowsButton implements Button { @Override public void render() { System.out.println("Rendering Windows Button"); } } // Mac 스타일 버튼 class MacButton implements Button { @Override public void render() { System.out.println("Rendering Mac Button"); } } // Windows 스타일 체크박스 class WindowsCheckbox implements Checkbox { @Override public void render() { System.out.println("Rendering Windows Checkbox"); } } // Mac 스타일 체크박스 class MacCheckbox implements Checkbox { @Override public void render() { System.out.println("Rendering Mac Checkbox"); } }
3. 추상 팩토리 정의
interface GUIFactory { Button createButton(); Checkbox createCheckbox(); }
4. 구체 팩토리 정의
class WindowsFactory implements GUIFactory { @Override public Button createButton() { return new WindowsButton(); } @Override public Checkbox createCheckbox() { return new WindowsCheckbox(); } } class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } @Override public Checkbox createCheckbox() { return new MacCheckbox(); } }
5. 클라이언트 코드
class Application { private Button button; private Checkbox checkbox; public Application(GUIFactory factory) { button = factory.createButton(); checkbox = factory.createCheckbox(); } public void render() { button.render(); checkbox.render(); } }
6. 실행 클래스
public class AbstractFactoryDemo { public static void main(String[] args) { // 클라이언트가 Windows 스타일을 선택한 경우 GUIFactory windowsFactory = new WindowsFactory(); Application windowsApp = new Application(windowsFactory); windowsApp.render(); System.out.println("----------------"); // 클라이언트가 Mac 스타일을 선택한 경우 GUIFactory macFactory = new MacFactory(); Application macApp = new Application(macFactory); macApp.render(); } }
결과 출력
Rendering Windows Button Rendering Windows Checkbox ---------------- Rendering Mac Button Rendering Mac Checkbox
코드 설명
- 추상 제품(Button, Checkbox): 각 운영체제에 상관없이 공통으로 제공해야 할 인터페이스를 정의합니다.
- 구체 제품(WindowsButton, MacButton, WindowsCheckbox, MacCheckbox): 각 운영체제에 맞는 구현을 제공합니다.
- 추상 팩토리(GUIFactory): 버튼과 체크박스를 생성하는 팩토리 메서드를 정의합니다.
- 구체 팩토리(WindowsFactory, MacFactory): 각 운영체제에 맞는 팩토리를 제공합니다.
- 클라이언트(Application): 팩토리를 통해 필요한 객체를 생성하고 사용하는 책임을 갖습니다.
추상 팩토리(Abstract Factory) 패턴
추상 팩토리 패턴은 생성(Creational) 디자인 패턴에 속하며, 객체의 생성 로직을 클라이언트 코드와 분리하고, 관련된 객체들을 그룹화하여 일관된 방식으로 생성할 수 있도록 돕는 패턴입니다.
이 패턴은 팩토리 메서드 패턴의 확장판으로, 서로 연관된 객체들의 집합을 생성할 때 유용합니다. 이를 통해 클라이언트는 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 객체를 생성합니다.
특징
- 객체 생성 로직의 추상화: 클라이언트는 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 객체를 생성합니다.
- 일관성 보장: 같은 팩토리를 사용하여 생성된 객체들은 서로 호환성을 유지합니다.
- 확장성: 새로운 제품군을 쉽게 추가할 수 있습니다.
구성 요소
- 추상 팩토리(AbstractFactory): 팩토리의 인터페이스를 정의합니다. 관련된 객체들을 생성하는 메서드를 선언합니다.
- 구체 팩토리(ConcreteFactory): 추상 팩토리를 구현하여 실제 객체를 생성합니다.
- 추상 제품(AbstractProduct): 생성되는 제품들의 인터페이스를 정의합니다.
- 구체 제품(ConcreteProduct): 추상 제품을 구현하는 구체적인 클래스입니다.
- 클라이언트(Client): 추상 팩토리를 통해 객체를 생성하고 사용합니다.
Java로 Abstract Factory 예시
예제: GUI 툴킷
사용자가 운영체제(Windows 또는 Mac)에 따라 다른 스타일의 버튼과 체크박스를 생성하도록 설계합니다.
1. 추상 제품 정의
java코드 복사// 추상 제품: 버튼 interface Button { void render(); } // 추상 제품: 체크박스 interface Checkbox { void render(); }2. 구체 제품 정의
java코드 복사// Windows 스타일 버튼 class WindowsButton implements Button { @Override public void render() { System.out.println("Rendering Windows Button"); } } // Mac 스타일 버튼 class MacButton implements Button { @Override public void render() { System.out.println("Rendering Mac Button"); } } // Windows 스타일 체크박스 class WindowsCheckbox implements Checkbox { @Override public void render() { System.out.println("Rendering Windows Checkbox"); } } // Mac 스타일 체크박스 class MacCheckbox implements Checkbox { @Override public void render() { System.out.println("Rendering Mac Checkbox"); } }3. 추상 팩토리 정의
java코드 복사interface GUIFactory { Button createButton(); Checkbox createCheckbox(); }4. 구체 팩토리 정의
java코드 복사class WindowsFactory implements GUIFactory { @Override public Button createButton() { return new WindowsButton(); } @Override public Checkbox createCheckbox() { return new WindowsCheckbox(); } } class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } @Override public Checkbox createCheckbox() { return new MacCheckbox(); } }5. 클라이언트 코드
java코드 복사class Application { private Button button; private Checkbox checkbox; public Application(GUIFactory factory) { button = factory.createButton(); checkbox = factory.createCheckbox(); } public void render() { button.render(); checkbox.render(); } }6. 실행 클래스
java코드 복사public class AbstractFactoryDemo { public static void main(String[] args) { // 클라이언트가 Windows 스타일을 선택한 경우 GUIFactory windowsFactory = new WindowsFactory(); Application windowsApp = new Application(windowsFactory); windowsApp.render(); System.out.println("----------------"); // 클라이언트가 Mac 스타일을 선택한 경우 GUIFactory macFactory = new MacFactory(); Application macApp = new Application(macFactory); macApp.render(); } }
결과 출력
mathematica코드 복사Rendering Windows Button Rendering Windows Checkbox ---------------- Rendering Mac Button Rendering Mac Checkbox
코드 설명
- 추상 제품(Button, Checkbox): 각 운영체제에 상관없이 공통으로 제공해야 할 인터페이스를 정의합니다.
- 구체 제품(WindowsButton, MacButton, WindowsCheckbox, MacCheckbox): 각 운영체제에 맞는 구현을 제공합니다.
- 추상 팩토리(GUIFactory): 버튼과 체크박스를 생성하는 팩토리 메서드를 정의합니다.
- 구체 팩토리(WindowsFactory, MacFactory): 각 운영체제에 맞는 팩토리를 제공합니다.
- 클라이언트(Application): 팩토리를 통해 필요한 객체를 생성하고 사용하는 책임을 갖습니다.
추상 팩토리 패턴의 장점
- 구현 세부 사항을 클라이언트로부터 숨김: 클라이언트는 구체적인 클래스 대신 인터페이스와 팩토리를 통해 객체를 생성하므로, 구현 세부 사항을 알 필요가 없습니다.
- 일관된 제품 생성: 같은 팩토리를 통해 생성된 객체들은 서로 호환성이 유지됩니다.
- 확장성: 새로운 제품군을 추가하기 쉬워 유지보수가 용이합니다.
추상 팩토리 패턴의 단점
- 복잡성 증가: 각 제품군마다 새로운 팩토리와 클래스를 정의해야 하므로 코드가 복잡해질 수 있습니다.
- 변경 비용 증가: 새로운 메서드를 추가하거나 인터페이스를 변경하면 많은 클래스에 영향을 미칩니다.
추상 팩토리와 팩토리 메서드의 차이
- 팩토리 메서드는 하나의 제품 객체를 생성하는 데 사용되며, 단일 객체 생성에 초점이 맞춰져 있습니다.
- 추상 팩토리는 관련된 여러 제품 객체의 집합을 생성하는 데 사용됩니다.
반응형'Java > 디자인패턴' 카테고리의 다른 글
행동(Behavioral) - 방문자(Visitor) 패턴 (0) 2024.11.18 행동(Behavioral) - 중재자(Mediator) 패턴 (0) 2024.11.17 구조적(Structural) - 플라이웨이트(Flyweight) 패턴 (1) 2024.11.15 행동(Behavioral) - 관찰자(Observer) 패턴 (0) 2024.11.14 구조패턴 - 프록시(Proxy) 패턴 (0) 2024.11.13