ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 팩토리 매서드 패턴
    디자인패턴 2021. 11. 19. 19:01

    1. 팩토리 패턴이란?

    : 일반적으로 생성자를 통해서 객체를 만드는 형식에서 벗어나 객체를 만들어 주는 기능을 서브 클래스에 위임하는 패턴입니다. 서브 클래스 및 팩토리 매서드를 객체를 만들어내는 공장으로 이해할 수 있습니다.

     

     

    2. 장점

    • 생성자에서 오류 상황 감지시 Null 을 반환 할 수 있다.
    • 다형적으로 객체 생성이 가능하다
    • 클라이언트는 본인에게 익숙한 인자를 통해 객체 생성이 가능하다
      • ex) 객체 생성시 필요한 값 대신 사용자와 친숙한 Enum 값을 넘겨주고 실질적인 객체 생성에 필요한 처리는 내부적으로 실행

     

    3. ExampleCode

    진짜 팩토리 매서드 패턴은 아니지만 이해를 돕기 위해 중간 과정쯤 되는 코드이다.

     

    기존에 생성자를 private 으로 설정함으로써 원래 생성자를 비활성화하고 팩토리 메서드를 통해서 객체를 생성한다. 그러나 이때 문제가 생긴다. 바로 static 메서드는 다형적인 구현이 불가하다는 것이다.

    public class Cup {
        int sizeMl;
    
        private Cup(int sizeMl) {
            this.sizeMl = sizeMl;
        }
    
        public static Cup createOrNull(CupSize cupSize) {
            switch (cupSize) {
                case LARGE:
                    return new Cup(200);
                case SMALL:
                    return new Cup(100);
                default:
                    assert (false) : "unhandledCupSize";
                    return null;
            }
        }
    }​

     

    4. 다형적 사용법

     

    만약 다양한 국가에 맞는 각각에 사이즈로 생성하고 싶다면?

     

    위에서 createCupOrNull 메서드를 static 메서드로 구현했지만 static 매서드는 상속이 불가하므로 다형적으로 사용하기위해  Cup의 인스턴스를 만들어줄 새로운 클래스 Menu에 해당 매서드를 구현합니다.

     

    더 나아가 creteOrNull의 리턴을 추상 클래스 혹인 인터페이스인 Cup 으로 설정함으로써 다형적인 객체 생성이 가능합니다.

     

    // main - 팩토리 메서드 없이
    
    Menu menu = new KoreanMenu;
    Cup cup;
    if(menu isintanceof AmericaMenu){
    	cup = New AmericanCup();
    }else if(menu isintanceof == KoreanMenu){
    	cup = New KoreanCup();
    }
    
    
    // main - 팩토리 메서드 있이
    
    Menu menu = new KoreanMenu;
    Cup cup = menu.makeOrNull();

     

    클래스 구조도를 확인해볼 필요가 있습니다.

    Cup 의 접근제어자는 protected 이고 

    PaperCup 과 GlassCup 은 default 입니다. 

     

    Menue와 Cup 등에 클래스등은 한 패키지 안에 넣고

    실행을 위한 main 메서드는 다른 패키지에 제작함으로서 cup 들의 직접적인 생성을 막고

    Menue 를 통한 각각의 cup 의 생성을 가능하게 합니다.

     

    댓글

Designed by Tistory.