[디자인패턴] 생성 패턴 - 추상 팩토리 메서드

목적

  • 종속적인 객체의 집합을 생성하는 인터페이스를 제공
  • 구체적인 클래스 명시 없이도 객체의 집합을 생성가능하다.

의의

  • 유현성과 확장성 증대
  • 구체적인 팩토리 클래스를 캡슐화
    • 일련의 관련 객체 생성가능
  • 인터페이스를 통해 객체를 생성하고 조작가능
    • 시스템의 독립성과 확장성이 증대된다.

버튼과 체크박스를 통한 팩토리 메서드

public interface Button {
    void render();
}
  • 버튼이라는 인터페이스
  • render 하는 기능을 구현을 강제하기 위하여 생성
// Concrete Product A1
class RoundButton implements Button {
    public void render() {
        System.out.println("Rendering Round Button");
    }
}

// Concrete Product A2
class SquareButton implements Button {
    public void render() {
        System.out.println("Rendering Square Button");
    }
}
  • 각각 둥근 버튼과 사각형 버튼은 Button 인터페이스를 상속받아
  • 각각 다른 모양의 버튼을 렌더링할 수 있도록 한다.
// Abstract Product B
interface Checkbox {
    void render();
}

// Concrete Product B1
class RoundCheckbox implements Checkbox {
    public void render() {
        System.out.println("Rendering Round Checkbox");
    }
}

// Concrete Product B2
class SquareCheckbox implements Checkbox {
    public void render() {
        System.out.println("Rendering Square Checkbox");
    }
}
  • 체크박스도 동일한 방식으로 만든다.
// Abstract Factory
interface GuiFactory {
    Button createButton();
    Checkbox createCheckbox();
}
  • GuiFactory 인터페이스 → 추상 팩토리가 된다.
  • 무조건적으로 Button 과 체크박스를 생성하여 객체의 집합을 만들도록 제약한다.
// Concrete Factory 1
class RoundGuiFactory implements GuiFactory {
    public Button createButton() {
        return new RoundButton();
    }

    public Checkbox createCheckbox() {
        return new RoundCheckbox();
    }
}

// Concrete Factory 2
class SquareGuiFactory implements GuiFactory {
    public Button createButton() {
        return new SquareButton();
    }

    public Checkbox createCheckbox() {
        return new SquareCheckbox();
    }
}
  • 둥근Gui 와 사각형 Gui 팩토리가 각각 추상 팩토리 인터페이스를 구현하여
  • 각각 클래스 기능에 맞는 버튼을 생성한다.
// Client code
public class Client {
    private Button button;
    private Checkbox checkbox;

    public Client(GuiFactory factory) {
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }

    public void render() {
        button.render();
        checkbox.render();
    }

    public static void main(String[] args) {
        Client roundClient = new Client(new RoundGuiFactory());
        roundClient.render();

        Client squareClient = new Client(new SquareGuiFactory());
        squareClient.render();
    }
}
  • 팩토리클래스를 생성자로 받습니다.
  • 그로인하여 별도의 if-else 나 switch 등의 분기에서 탈출할 수 있게 되며
  • 개발 사용자에게 오로지 어떤 클래스를 생성할 것인지 선택하는 분기만을 제공하여 집중도를 증대시키며
  • 코드 유지보수성면에서 객체의 생성의 확장성에 대해 이점을 가집니다.
추상 팩토리 패턴은 Factory of Factories 라고 합니다.

Uploaded by N2T