Abstract Factory Pattern

개념
- 추상적인 부품을 조립해서 추상적인 제품을 만드는 추상적인 공장 같은 패턴

I. 의도

    구체적 클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스 제공

II. 정의

     추상적인 부품을 조립해서 추상적인 제품을 만드는 추상적인 공장 같은 패턴 클라이언트에서 구상 클래스를 지정하지 않으면서도 일군의 객체를 생성할 수 있도록 하는 패턴

III. 활용        

  • 생성되고 구성되고 표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때 – look and feel

(참고 : look and feel : 컴퓨터 화면에 나타난 아이콘 또는 메뉴를 보고 난 후에 어떤 명령을 내릴 것인가를 선택할 수 있게 하는 사용자 환경을 말하며, 어떤 명령을 내릴 것인지 먼저 생각하고 나서 키를 입력하는 방식(think-and-type )과의 차별성을 두기 위한 표현임)

  • 하나 이상의 제품군들 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체 가능할 때
  • 관련된 객체군을 함께 사용해서 시스템을 설계하고, 이 제품이 갖는 제약사항을 따라야 할 때
  • 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 표현하고 싶을 때

IV. 결과

  • 구체적인 클래스를 분리한다 – 추성클래스가 정의한 인터페이스를 통해서만 클라이언트 프로그램을 작성한다
  • 제품군을 쉽게 대체할 수 있도록 한다
  • 제품간의 일관성을 증진한다
  • 새로운 종류의 제품을 제공하기 어렵다 – 새로운 제품에 대해 추상 팩토리를 확장하는 것이 어렵다

단점: 클래스 계층이 커질 수 있다

관련 패턴: AbstractFactory 클래스는 Factory Method 패턴이나 Prototype 패턴을 이용해서 구현된다. Concrete Factory의 경우는 Singleton 이 대부분이다

 

 

패턴 설명

- Builder 패턴 역시 하나의 제품을 생산하는데 그 목적이 있기 때문에 Factory 패턴과 맥락은 같지만, Factory 패턴은 이미 완성되어져 있는 제품 설계도를 가지고 누가 어떤걸 만들지 고민하는 반면, Builder 패턴은 여러 단계를 거쳐 하나의 객체를 커스터마이징하여 생산.

Abstract Factory 소스 코드

/* GUIFactory example -- */

 

interface GUIFactory {

    public Button createButton();

}

 class WinFactory implements GUIFactory {

    public Button createButton() {

        return new WinButton();

    }

}

 class OSXFactory implements GUIFactory {

    public Button createButton() {

        return new OSXButton();

    }

}

 interface Button {

    public void paint();

}

 

 class WinButton implements Button {

    public void paint() {

        System.out.println("I'm a WinButton");

    }

}

 class OSXButton implements Button {

    public void paint() {

        System.out.println("I'm an OSXButton");

    }

}

 class Application {

    public Application(GUIFactory factory){

        Button button = factory.createButton();

        button.paint();

    }

}

 public class ApplicationRunner {

    public static void main(String[] args) {

        new Application(createOsSpecificFactory());

    }

 public static GUIFactory createOsSpecificFactory() {

        int sys = readFromConfigFile("OS_TYPE");

        if (sys == 0) {

            return new WinFactory();

        } else {

            return new OSXFactory();

        }

    }

}

 

 

 

 

 

 

댓글