팩토리 메서드 패턴에는 템플릿 메서드 패턴이 사용된다.
해당 내용을 코드를 통해서 알아보자!
구현
요구사항
게임과 아이템과 아이템 생성을 구현
- 아이템을 생성하기 전에 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
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
References
'CS > DesignPattern' 카테고리의 다른 글
(DesignPattern) 프로토타입 패턴 (0) | 2020.05.04 |
---|---|
(DesignPattern) 싱글턴 패턴 (0) | 2020.05.02 |
(DesignPattern) 어댑터 패턴 (0) | 2020.04.21 |
(DesignPattern) 템플릿 메서드 패턴 (0) | 2020.04.20 |
(DesignPattern) 전략 패턴 (0) | 2020.04.20 |