ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 추상 팩토리(Abstract factory) 패턴
    CSE/Design Pattern 2015. 6. 13. 10:27

    Pattern #4  추상 팩토리 패턴



     구체적인 클래스의 명시없이 관련 객체의 패밀리를 생성하기 위한 인터페이스를 제공하기 위하여 사용.





     목적

      - 객체생성을 추상화하여 이를 사용하는 모듈과 독립적으로 인터페이스를 정의하는데 있다.

      - 인스턴스를 생성하기 위한 프레임워크와 실제로 인스턴스를 생성하는 클래스를 분리하여 생각



     결과

      - 패밀리에 있는 각 클래스의 팩토리 메소드를 가진 클래스에서 패밀리를 생성

      


     


     

     동기

      


      

      당신은 상용 에디터 프로그램의 사용자 인터페이스 부분의 개발을 맡았다. 시장을 넓히기 위하여, 이 프로그램은 MS-Windows GUI환경과 리눅스의 Motif GUI환경을 지원하여야 한다. 하나의 프로그램 소스코드에서 두 가지 GUI를 지원하려면??

      



     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /* MS windos GUI */
    MSWindow *win = new MSWindow;
    MSScrollbar *scrollbar = new MSScrollbar;
    MSMenu *menu = new MSMemu;
    MSMenuItem *i1 = new MSMenuItem;
    win->addScrollbar(scrollbar);
    menu->addItem(i1);
    win->addMenu(menu);
     
     
    /* Linux Motif GUI */
    MotifWindow *win = new MotifWindow;
    MotifScrollbar *scrollbar = new MotifScrollbar;
    MotifMenu *menu = new MotifMemu;
    MotifMenuItem *i1 = new MotifMenuItem;
    win->addScrollbar(scrollbar);
    menu->addItem(i1);
    win->addMenu(menu);
    cs






     이 두 플랫폼을 Abstract Factory를 통하여 구현하자!



     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifdef MSWINDOWS
    GUIFactory *factory = new MSFactory;
    #elif
    GUIFactory *factory = new MotifFactory;
    #end
    Window *win = factory->createWindow();
    Scrollbar *scrollbar = factory->createScrollbar();
    Menu *menu = factory->createMenu();
    MenuItem *i1 = factory->createMenuItem();
    win->addScrollbar(scrollbar);
    menu->addItem(i1);
    win->addMenu(menu);
    cs








     




     의도

       구체적인 클래스를 미리 정하지 않고, 상호 관련 있는 객체들의 패밀리(family)를 생성하는 인터페이스를 제공


     별칭 

       Kit


     적용

      - 시스템이 내부에 사용되는 product들의 생성과 조합에 독립적일 필요가 있을 경우에 사용한다.

      - 시스템이 몇 개의 제품 군(product family) 중 하나를 선택하여 환경 설정될 때 사용한다.

      - 특정 제품 군이 선택되면, 해당 제품 군 내의 제품(product)들만 사용되도록 강제할 필요가 있을 경우 사용한다.







     결과

      - 추상성을 높인다. => Client Code에서는 구체적 Product 클래스를 모름

      - Product family 교환이 쉽다. => 초기(혹은 실행시)에 ConcreteFactory를 바꿈으로써 원하는 제품군으로 쉽게 교환 가능.

      - Product간의 일관성을 증진시킨다. => 사용되는 product들이 같은 factory에서 생성되기 때문에 동일한 product family임이 보장된다.

      - 새로운 종류의 product family를 추가하기 쉽다.

      - 새로운 종류의 Product 추가는 힘들다.




    예제를 통하여 알아보자.





    CPU.java


    1
    2
    3
    4
    5
    6
    package abstractfactory;
     
    public interface CPU {
        public void process();
    }
     
    cs

     



    AMDCPU.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package abstractfactory;
     
    public class AMDCPU implements CPU {
     
        public void process() {
            System.out.println("AMD is processing...");
        }
    }
     
    cs



    IntelCPU.java



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package abstractfactory;
     
    public class IntelCPU implements CPU {
     
        public void process() {
            System.out.println("Intel is processing...");
        }
    }
     
    cs





    CPUFactory.java 


    1
    2
    3
    4
    5
    6
    7
     
    package abstractfactory;
     
    public interface CPUFactory {
        public CPU produceCPU();
    }
     
    cs






    AMDFactory.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package abstractfactory;
     
    public class AMDFactory implements CPUFactory {
     
        public CPU produceCPU() {
            return new AMDCPU(); 
        }
    }
     
    cs




    IntelFactory.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package abstractfactory;
     
    public class IntelFactory implements CPUFactory {
     
        public CPU produceCPU() {
            return new IntelCPU();
        }
    }
     
    cs





    Computer.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    package abstractfactory;
     
    public class Computer {
        private CPU cpu;
     
        public Computer(CPUFactory factory) {
            cpu = factory.produceCPU();
            cpu.process();
        }
    }
     
    cs






    Client.java



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    package abstractfactory;
     
    public class Client {
        public static void main(String[] args) {
            new Computer(createSpecificFactory());
        }
     
        public static CPUFactory createSpecificFactory() {
            int sys = 0;
     
            if (sys == 0) {
                return new AMDFactory();
            } else {
                return new IntelFactory();
            }
        }
    }
     
    cs

















     



    댓글

Designed by Tistory.