본문 바로가기
아키텍처/디자인 패턴

4. Factory Method Pattern

by doflamingo 2020. 12. 13.

팩토리 메소드 패턴은 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며, 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다.

 

Creator라는 부모클래스로 생성하지만 그 Creator을 구현하는 ConcreteCreator에 따라 생성되는 객체가 바뀌게 되는 것이다. 

 

factory method pattern

팩토리 메소드 패턴의 의도

객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 합니다.

 

구체적인 예를 통해 보게되면

ItemCreator라는 클래스를 통해 Item을 생성할 것인데 그 Item은 HpPotion과 MpPotion 두가지 종류가 존재한다.

즉, Item 인터페이스를 상속받는 두개의 클래스가 존재하는 것이다. 

그리고 각각의 클래스를 생성하는 ItemCreator도 존재하게 된다.

 

우선 Item 인터페이스와 이를 상속하는 HpPotion과 MpPotion 클래스가 존재한다. 

//Item 인터페이스
public interface Item {
  void use();
}


//Hp Potion
public class HpPotion implements Item {
  @Override
  public void use() {
    System.out.println("체력 회복");
  }
}


//Mp Potion
public class MpPotion implements Item {
  @Override
  public void use() {
    System.out.println("마력 회복");
  }
}

 

우선 ItemCreator을 보면

public abstract class ItemCreator {

  //팩토리 메소드 (템플릭 메소드 패턴처럼 사용)
  public Item create() {
    //아이템 정보 가져오기
    requestItemInfo();
    //아이템 생성
    Item item = createItem();
    //로그 찍기
    createItemLog();
    return item;
  }
  //아이템을 생성하기 전에 데이터 베이스에서 아이템 정보를 요청
  protected abstract void requestItemInfo();
  //아이템을 생성 후 아이템 복제 등의 불법을 방지하기 위해 데이터 베이스에 아이템을 생성
  protected abstract void createItemLog();
  //아이템을 생성하는 알고리즘
  protected abstract Item createItem();
}

create라는 팩토리 메소드를 통해서 생성이 되는 것이다. 

이 팩토리 메소드는 템플릿 메소드와 유사하게 여러 로직을 같이 넣을 수 있다. 

 

그리고 이 추상 클래스를 상속한 HpCreator와 MpCreator가 존재한다.

//HP Creator
public class HpCreator extends ItemCreator {
  @Override
  protected void requestItemInfo() {
    System.out.println("데이터베이스에서 체력 회복 물약의 정보를 가져온다.");
  }

  @Override
  protected void createItemLog() {
    System.out.println("체력 회복 물약을 생성 했습니다. "+ new Date());
  }

  @Override
  protected Item createItem() {
    return new HpPotion();
  }
}

//MP Creator
public class MpCreator extends ItemCreator {
  @Override
  protected void requestItemInfo() {
    System.out.println("데이터베이스에서 마력 회복 물약의 정보를 가져온다.");
  }

  @Override
  protected void createItemLog() {
    System.out.println("마력 회복 물약을 생성 했습니다. "+ new Date());
  }

  @Override
  protected Item createItem() {
    return new MpPotion();
  }
}

여기서 중요한 것은 creatItem을 각각 구체 클래스로 Return을 해주게 되면 각각 Item을 생성하는 creator을 만들 수 있게 된다.

 

이제 Main함수에서 호출하는 것을 보게 되면 사용에 맞는 Creator을 만들어주고 create를 이용해서 만들면 각각 Item이 생성된 것을 알 수 있다. 

public class Main {
  public static void main(String[] args) {
    ItemCreator creator = new HpCreator();
    Item item = creator.create();
    item.use();

    creator = new MpCreator();
    item = creator.create();
    item.use();
  }
}

결과

 

이렇게 팩토리 메소드 패턴을 이용하게 되면 또다른 Item을 생성할 때도 생성할때 필요한 로직을 중복해서 작성할 필요없이 해당 Creator만 생성하면 쉽게 만들 수 있게 된다.

즉, 확장성과 중복 측면에서 좋아진다.

 

코드

 

 

- 출처 - 

youtu.be/-gyoG-7MHLI

johngrib.github.io/wiki/factory-method-pattern/

ko.wikipedia.org/wiki/%ED%8C%A9%ED%86%A0%EB%A6%AC_%EB%A9%94%EC%84%9C%EB%93%9C_%ED%8C%A8%ED%84%B4

'아키텍처 > 디자인 패턴' 카테고리의 다른 글

5. Singleton Pattern  (0) 2020.12.13
3. Template Method Pattern  (0) 2020.12.13
2. Adapter Pattern  (2) 2020.12.10
1. Strategy Pattern  (0) 2020.12.09

댓글