CS/DesignPattern

(DesignPattern) 팩토리메서드 패턴

주누 2020. 4. 22. 23:31

팩토리 메서드 패턴에는 템플릿 메서드 패턴이 사용된다.

 

해당 내용을 코드를 통해서 알아보자!


구현

요구사항

게임과 아이템과 아이템 생성을 구현
- 아이템을 생성하기 전에 DB에서 아이템 정보를 요청
- 아이템을 생성 후 아이템 복제 등의 불법을 방지하기 위해 DB에 아이템 생성 정보를 남긴다.

아이템을 생성하는 주체는 ItemCreator이다.

아이템은 item이라는 interface로 선언한다.
- item은 use 메서드를 기본적으로 가지고 있다.

현재 아이템의 종류는 체력 회복 물약, 마력 회복 물약이 존재한다.

 

1. item 인터페이스 생성 - use() 메서드 

public interface Item {
    public void use();
}

2. ItemCreator 추상 클래스 생성 - 템플릿 메서드 패턴

 

public abstract class ItemCreator {

    public Item create() {
        Item item;

        //Step01
        requestItemInfo();
        //Step02
        item = createItem();
        //Step03
        createItemLog();

        return item;
    }

    //아이템을 생성하기 전에 데이터 베이스에서 아이템 정보를 요청합니다.
    abstract protected void requestItemInfo();
    //아이템을 생성 후 아이템 복제 등의 불법을 방지하기 위해 데이터 베이스에 아이템 생성
    abstract protected void createItemLog();
    //아이템을 생성하는 알고리즘
    abstract protected Item createItem();
    
}

특정한 호출 순서가 있기 때문에 템플릿 메서드 패턴을 활용한다. (step01 ~ step03)

https://jwdeveloper.tistory.com/226?category=862052

 

(DesignPattern) 템플릿 메서드 패턴

템플릿 메서드 패턴이란? 알고리즘 구조를 메서드에 정의하고 하위 클래스에서 알고리즘 구조의 변경 없이 해당 알고리즘을 재 정의하는 패턴 When? 구현하려는 알고리즘이 일정한 프로세스가 있을 때 구현하려는..

jwdeveloper.tistory.com


3. 구현 클래스 생성 

 

1) 이전에 생성하였던 item 인터페이스를 implements 하는 구체 클래스를 작성한다. - 요구사항의 체력 회복 물약, 마력 회복 물약

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

마력 회복 물약은 위와 상응하게 구현

 

2) 위의 포션을 사용하기 위한 Creator가 필요 - ItemCreator 추상 클래스를 상속해서 구현

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

마력 회복 물약은 위와 상응하게 구현


4. Main 함수 생성

public class Main {
    public static void main(String[] args) {
        Item item;
        ItemCreator itemCreator;

        itemCreator = new HpCreator();
        item = itemCreator.create();
        item.use();

        itemCreator = new MpCreator();
        item = itemCreator.create();
        item.use();

    }
}

실행결과


정리

  • 이전에 ItemCreator 추상 클래스의 create 메서드에서 단계별로 차례대로 호출해주는 방식으로 구현하였다. 이를 펙토리 메서드라고 부른다. 
  • creator와 item에 대한 구현이 각각 분리되었음을 보았다. 이를 통해서 구조와 구현의 분리에 대해 알 수 있다.
팩토리 메서드 패턴은 템플릿 메서드 패턴의 응용 버전으로
템플릿 메서드 패턴과 같이 일정한 호출에 대한 순서가 존재하며 인스턴스의 생성을 하위 클래스에게 위임한다는 특징을 가진다.

Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/EffectiveStudy

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

References