Abstract Factory 패턴은 연관성이 있는 객체군이 여러벌 있을 경우 각각의 구체 Factory 클래스를 통해 동일한 객체군을 생성하는 패턴이다.

예를 들어 윈도우 화면을 만든다고 생각해 보자. 윈도우에는 버튼도 들어갈 수 있고 에디터 박스도 들어갈 수 있다. 실행 환경에 따라서 구분해 보면 Linux 환경, 윈도우 XP 환경 등 다양하다. 이 실행 환경에 따라서 윈도우의 모양(테마)은 바뀔 수 있다. 이 경우 버튼과 에디터 박스는 공통으로 생성될 수 있지만 테마는 Linux냐 Xp냐에 따라서 다르다. 이런 경우 Linux와 연관된 객체군들은 Linux 객체군을 생성하는 클래스가, Xp와 연관된 객체군들은 Xp 객체군을 생성하는 클래스가 생성하도록 할 수 있다. 이런 상황을 구현하는 패턴이 Abstract Factory 패턴이다.

Abstract Factory 패턴을 설명하기 앞서서 Factory Method 패턴과의 관계를 알아보자.

유사점 : 객체를 생성하고, 구체적인 타입을 감춘다.

차이점

1. Factory Method 패턴은 생성 이후 해야 할 일의 공통점을 정의하는데 촛점을 맞추는 반면, Abstract Factory 패턴은 생성해야 할 객체군의 공통점에 촛점을 맞춘다.

2. 따라서 Factory Method 패턴은 생성해야 할 객체가 한 종류이고, Abstract Factory 패턴은 여러 종류이다.


물론 유사점과 차이점을 조합해서 복합 패턴을 구성하는 것도 가능하다.


그러면 Abstract Factory 패턴의 구현을 알아보자.

Abstract Factory 패턴 클래스 다이어그램

Abstract Factory 패턴의 구현

interface IFactory

{

    public IButton createButton();

    public IEdit createEdit();

};

interface IButton {};

interface IEdit   {};

class XPFactory implements IFactory

{

    public IButton createButton() {/// XpButton을 생성하는 함수.

        return new XpButton();

    }

    public IEdit createEdit() {/// XpEdit를 생성하는 함수.

        System.out.println("XpEdit()");

        return new XpEdit();

    }

}

class LinuxFactory implements IFactory

{

    public IButton createButton() {/// LinuxButton을 생성하는 함수.

        System.out.println("LinuxButton()");

        return new LinuxButton();

    }

    public IEdit createEdit() {/// LinuxEdit를 생성하는 함수.

        System.out.println("LinuxEdit()");

        return new LinuxEdit();

    }

}

class XpEdit implements IEdit {

    public XpEdit(){System.out.println("XpEdit()");}

};

class XpButton implements IButton {

    public XpButton(){System.out.println("XpButton()");}

};

class LinuxEdit implements IEdit {

    public LinuxEdit(){System.out.println("LinuxEdit()");}

};

class LinuxButton implements IButton {

    public LinuxButton(){System.out.println("LinuxButton()");}

};


사용 방법

public static void main(String[] args) {

    IFactory factory = null;

    factory = new LinuxFactory();

    System.out.println("LinuxFactory()");

    factory.createButton();

    factory.createEdit();

    factory = new XPFactory();

    System.out.println("XPFactory()");

    factory.createButton();

    factory.createEdit();

}


위의 예제에서는 객체 군에는 Xp와 Linux가 있고, 객체의 종류에는 Edit와 Button이 있다. 그리고 각각을 구현한 XpEdit와 XpButton, LinuxEdit와 XpButton이 있다.

Abstract Factory 패턴의 목적은 연관성 있는 객체군을 생성할 수 있도록 제어하는 것이다. Xp용 윈도우를 만들고 싶다면 XpEdit와 XpButton을 생성할 수 있도록 하고, Linux용 윈도우를 만들고 싶다면 LinuxEdit와 LinuxButton을 생성할 수 있도록 하는 것이다. 이를 위해서는 연관성 있는 객체군을 생성할 수 있는 객체를 만들어야 한다. 그리고 또 하나 중요한 부분은 객체가 생성된 이후에는 Xp인지 Linux인지를 알 수 없도록 하는 것이다.

이를 위해서 객체군 생성을 담당하는 Factory를 선언한다. 객체군이 여럿(Xp, Linux)이기 때문에 IFactory라는 인터페이스를 먼저 만든다. 그리고 Xp 윈도우 용 객체들을 생성할 수 있는 XpFactory, Linux용 객체들을 생성할 수 있는 LinuxFactory를 만든다. 그런 다음 각각의 객체군들에 맞게 객체를 생성하는 메소드를 구현해 주면 된다.

이 과정에서 XpButton과 LinuxButton은 객체 생성 이후에 구분되어서는 안된다. 따라서 공통 인터페이스인 IButton을 구현하도록 한다. Edit쪽도 마찬가지로 IEdit를 구현하도록 만들어 준다.

'5.디자인패턴' 카테고리의 다른 글

Proxy 패턴과 그 활용  (0) 2016.09.16
Observer 패턴  (0) 2016.09.16
Factory Method 패턴  (4) 2016.09.16
Memento 패턴  (2) 2016.09.13
Bridge 패턴  (0) 2016.09.13
Posted by 이세영2
,