5.디자인패턴

Enum Abstract Factory 패턴

이세영2 2016. 9. 16. 18:14

미리 봐야 할 것 : Abstract Factory 패턴

Abstract Factory 패턴의 경우도 Factory Method 패턴과 마찬가지로 Factory 객체 생성의 이슈가 있다. 가만히 놔두면 Factory 객체가 자주 생성될 수 있고, 이를 해결하려면 Singleton 패턴을 적용해 주어야 한다. 이러한 문제를 해결하는 방법으로 enum을 활용한 방법이 있다. 이를 Enum Abstract Factory 패턴이라고 한다.


우선 생성하고자 하는 대상을 알아보자. Abstract Factory 패턴은 일련의 연관성 있는 객체 군을 생성하는 패턴이다. Xp 객체 군과 Linux 객체군이 있다고 가정하자. 그리고 각 객체군은 Button과 Edit 객체를 포함하고 있다. 마지막으로 생성된 Button과 Edit 객체는 객체군과 상관 없이 동일하게 취급 되어야 한다. 따라서 IButton과 IEdit와 같이 인터페이스를 선언해 주고 Xp 타입과 Linux 타입에 해당하는 클래스들을 선언해 준다.


생성하고자 하는 객체들의 선언

interface IButton {};

interface IEdit   {};

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()");}

};


이제 Abstract Factory를 enum을 이용해서 구현한다.


Enum Abstract Factory의 구현

interface IFactory

{

    public IButton createButton();

    public IEdit createEdit();

};


public enum EnumAbstractFactory implements IFactory{

    XP{

        public IButton createButton() {

            return new XpButton();

        }

        public IEdit createEdit() {

            return new XpEdit();

        }

    }

    ,LINUX{

        public IButton createButton() {

            return new LinuxButton();

        }

        public IEdit createEdit() {

            return new LinuxEdit();

        }

    }

    ;

}

각 Factory들도 사용하는 측에서는 동일한 타입으로 취급이 가능해야 한다. 따라서 Factory들에 대한 추상 타입인 IFactory를 선언해 준다. 그리고 개별 Factory들이 IFactory를 구현하도록 선언해 준다. enum은 실제로 abstract class이기 때문에 인터페이스를 구현하는 것도 가능하다.


사용 방법

public static void main(String[] args) {

    IFactory factory = EnumAbstractFactory.XP;

    IButton button = factory.createButton();

    IEdit edit = factory.createEdit();

    factory = EnumAbstractFactory.LINUX;

    button = factory.createButton();

    edit = factory.createEdit();

}

사용 방법은 일반적인 enum과 동일하다. 대신 Factory 객체의 생성 문제가 enum을 통해 해결되었다. enum의 각 하위 타입은 public static final 키워드를 암시적으로 달고 있다. 따라서 Singleton의 특성을 가지기 때문에 별도로 생성할 필요가 없고, 오직 한번만 생성이 된다.