ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 생성패턴 : Abstract Factory 패턴
    디자인패턴 2012. 12. 18. 09:30
    반응형

    분류 : 생성패턴(Creational Patterns)

     

    정의 :

    관련있거나 연관된 객체들의 집합을 상세한 스펙없이 생성하는 인터페이스를 제공하기 위함.


    용도 :

    • 클라이언트 코드는 상세한 타입에 대해 모름. 관련된 헤더파일이나 클래스 선언을 include할 필요가 없음. 클라이언트 코드는 abstract 타입만 다룸. 상세한 타입의 객체들은 팩토리에 의헤 생성되지만, 클라이언트 코드는 추상 인터페이스를 통해서만 해당 객체들에 접근함.
    • 새로운 상세 타입을 추가하는 것은 다른 팩토리를 사용하기위해서는 클라이언트 코드를 수정하는 것으로 완료됨. 수정은 파일하나당 하나의 라인만 수정하면 됨.(다른 팩토리는 다른 상세타입의 객체들을 생성하지만 여전히 같은 abstract타입의 포인터를 반환함.) 새로운 타입을 인스턴스화하기위해 클라이언트 코드를 수정하는것보다 훨씬 쉬움. 그렇지 않으면 새 타입을 인스턴스화할때마다 새로운 객체가 생성된 코드에서 모든 위치를 변경해야 함. 모든 팩토리 객체들이 싱글톤 객체에 저장되고 모든 클라이언트 코드가 객체생성을 위한 팩토리에 접근하기위해 싱글톤을 통해야 한다면, 팩토리들의 변경은 싱글톤 객체를 변경하는것 만큼이나 쉬움.

    구조 :






    코드

    /* GUIFactory example -- */
     
    interface Button {
        void paint();
    }
     
    interface GUIFactory {
        Button createButton();
    }
     
    class WinFactory implements GUIFactory {
        public Button createButton() {
            return new WinButton();
        }
    }
     
    class OSXFactory implements GUIFactory {
        public Button createButton() {
            return new OSXButton();
        }
    }
     
    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();
        }
    
        private static int readFromConfigFile(String string) {
        //이 부분의 반환값을 0, 1로 변환하면서 출력되는 코드 값 확인해보면 됨.
    	return 0;
        }
    }
    



    참고자료

    GoF의 디자인패턴, 피어슨에듀케이션코리아, 2002

    http://en.wikipedia.org/wiki/Abstract_factory_pattern

    반응형

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

    생성패턴 : Singleton 패턴  (0) 2013.01.16
    생성패턴 : Prototype 패턴  (0) 2013.01.15
    생성패턴 : Factory Method 패턴  (0) 2013.01.10
    생성패턴 : Builder 패턴  (0) 2012.12.28
    디자인패턴  (0) 2012.11.13

    댓글

Designed by Tistory.