ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 생성(Creational) - 추상 팩토리(Abstract Factory) 패턴
    Java/디자인패턴 2024. 11. 16. 16:23
    반응형

    추상 팩토리(Abstract Factory) 패턴

    추상 팩토리 패턴은 생성(Creational) 디자인 패턴에 속하며, 객체의 생성 로직을 클라이언트 코드와 분리하고, 관련된 객체들을 그룹화하여 일관된 방식으로 생성할 수 있도록 돕는 패턴입니다.

    이 패턴은 팩토리 메서드 패턴의 확장판으로, 서로 연관된 객체들의 집합을 생성할 때 유용합니다. 이를 통해 클라이언트는 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 객체를 생성합니다.


    특징

    1. 객체 생성 로직의 추상화: 클라이언트는 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 객체를 생성합니다.
    2. 일관성 보장: 같은 팩토리를 사용하여 생성된 객체들은 서로 호환성을 유지합니다.
    3. 확장성: 새로운 제품군을 쉽게 추가할 수 있습니다.

    구성 요소

    1. 추상 팩토리(AbstractFactory): 팩토리의 인터페이스를 정의합니다. 관련된 객체들을 생성하는 메서드를 선언합니다.
    2. 구체 팩토리(ConcreteFactory): 추상 팩토리를 구현하여 실제 객체를 생성합니다.
    3. 추상 제품(AbstractProduct): 생성되는 제품들의 인터페이스를 정의합니다.
    4. 구체 제품(ConcreteProduct): 추상 제품을 구현하는 구체적인 클래스입니다.
    5. 클라이언트(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

     

    코드 설명

    1. 추상 제품(Button, Checkbox): 각 운영체제에 상관없이 공통으로 제공해야 할 인터페이스를 정의합니다.
    2. 구체 제품(WindowsButton, MacButton, WindowsCheckbox, MacCheckbox): 각 운영체제에 맞는 구현을 제공합니다.
    3. 추상 팩토리(GUIFactory): 버튼과 체크박스를 생성하는 팩토리 메서드를 정의합니다.
    4. 구체 팩토리(WindowsFactory, MacFactory): 각 운영체제에 맞는 팩토리를 제공합니다.
    5. 클라이언트(Application): 팩토리를 통해 필요한 객체를 생성하고 사용하는 책임을 갖습니다.

     

    추상 팩토리(Abstract Factory) 패턴

    추상 팩토리 패턴은 생성(Creational) 디자인 패턴에 속하며, 객체의 생성 로직을 클라이언트 코드와 분리하고, 관련된 객체들을 그룹화하여 일관된 방식으로 생성할 수 있도록 돕는 패턴입니다.

    이 패턴은 팩토리 메서드 패턴의 확장판으로, 서로 연관된 객체들의 집합을 생성할 때 유용합니다. 이를 통해 클라이언트는 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 객체를 생성합니다.


    특징

    1. 객체 생성 로직의 추상화: 클라이언트는 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 객체를 생성합니다.
    2. 일관성 보장: 같은 팩토리를 사용하여 생성된 객체들은 서로 호환성을 유지합니다.
    3. 확장성: 새로운 제품군을 쉽게 추가할 수 있습니다.

    구성 요소

    1. 추상 팩토리(AbstractFactory): 팩토리의 인터페이스를 정의합니다. 관련된 객체들을 생성하는 메서드를 선언합니다.
    2. 구체 팩토리(ConcreteFactory): 추상 팩토리를 구현하여 실제 객체를 생성합니다.
    3. 추상 제품(AbstractProduct): 생성되는 제품들의 인터페이스를 정의합니다.
    4. 구체 제품(ConcreteProduct): 추상 제품을 구현하는 구체적인 클래스입니다.
    5. 클라이언트(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

    코드 설명

    1. 추상 제품(Button, Checkbox): 각 운영체제에 상관없이 공통으로 제공해야 할 인터페이스를 정의합니다.
    2. 구체 제품(WindowsButton, MacButton, WindowsCheckbox, MacCheckbox): 각 운영체제에 맞는 구현을 제공합니다.
    3. 추상 팩토리(GUIFactory): 버튼과 체크박스를 생성하는 팩토리 메서드를 정의합니다.
    4. 구체 팩토리(WindowsFactory, MacFactory): 각 운영체제에 맞는 팩토리를 제공합니다.
    5. 클라이언트(Application): 팩토리를 통해 필요한 객체를 생성하고 사용하는 책임을 갖습니다.

    추상 팩토리 패턴의 장점

    1. 구현 세부 사항을 클라이언트로부터 숨김: 클라이언트는 구체적인 클래스 대신 인터페이스와 팩토리를 통해 객체를 생성하므로, 구현 세부 사항을 알 필요가 없습니다.
    2. 일관된 제품 생성: 같은 팩토리를 통해 생성된 객체들은 서로 호환성이 유지됩니다.
    3. 확장성: 새로운 제품군을 추가하기 쉬워 유지보수가 용이합니다.

    추상 팩토리 패턴의 단점

    1. 복잡성 증가: 각 제품군마다 새로운 팩토리와 클래스를 정의해야 하므로 코드가 복잡해질 수 있습니다.
    2. 변경 비용 증가: 새로운 메서드를 추가하거나 인터페이스를 변경하면 많은 클래스에 영향을 미칩니다.

    추상 팩토리와 팩토리 메서드의 차이

    • 팩토리 메서드는 하나의 제품 객체를 생성하는 데 사용되며, 단일 객체 생성에 초점이 맞춰져 있습니다.
    • 추상 팩토리는 관련된 여러 제품 객체의 집합을 생성하는 데 사용됩니다.
    반응형

    댓글

Designed by Tistory.