팩토리메소드
팩토리메소드는 앞서 배운 템플릿 메소드를 통해서 사용합니다.
2019/08/21 - [프로그래밍 언어/Java] - 디자인 패턴- Template Method Pattern
즉 구현부와 구조를 나누고 Item을 생성하거나 등 팩토리 메소드를 구현하여 사용합니다.
우선 데이터베이스에 아이템 정보를 요청하고 , 복제 방지를 위해 생성정보를 만들어주는 스탭들로 나뉘어져 있기때문에 템플릿 메소드 패턴을 사용해야합니다.
즉 아이템을 생성하는(팩토리) ItemCreator를 먼저 만듭시다. 구조와 구현부를 분리하여 구현할 수 있기 때문에 패키지를 구조(framework)와 구현(concrete)로 나누어서 만들어줍시다.
우선 framework 구조 부에 ItemCreator 클래스를 생성합니다.
package framework/ItemCreator.java
package framework;
/**
* 팩토리 프레임워크
* 여기서 프로세스가 있기 때문에 탬플릿 메소드 패턴도 있음
* @author dlwjd
*
*/
public abstract class ItemCreator {
//팩토리 메소드 => 템플릿 메소드 방식으로 구현 ㅇㅇ
public Item create() {
Item item;
requestItemsInfo();
item = createItem();
createItemLog();
return item;
}
//Step1 . 아이템을 생성하기전에 데이터베이스에 요청한다.
abstract protected void requestItemsInfo();
//Step2 . 아이템 복제륿 방지하기 위해서 데이터베이스에 아이템 생성 로그를 남긴다.
abstract protected void createItemLog();
//Step3 . 아이템을 생성하는 알고리즘
abstract protected Item createItem();
}
스탭에 따라 추상메소드를 구현해주고 이는 구체적인 아이템(HP물약, MP물약)을 생성하는 코드에서 구현합니다.
그리고 스탭을 사용하는 펙토리 메소드(템플릿 메소드로 구현)를 만들어줍시다.
package framework/Item.java(인터페이스)
package framework;
public interface Item {
public void use();
}
이는 인터페이스로 ItemCreator를 구현하여 만들어준 아이템을 사용하기 위한 인터페이스입니다.
이제 구현부인 package concrete로 가서 생성할 아이템인 Item 인터페이스를 구현한 HpPotion.java와 MpPotion.java를 생성해줍닌다.
package concrete/HpPotion.java/MpPotion.java
package concrete;
import framework.Item;
public class HpPotion implements Item{
@Override
public void use() {
// TODO Auto-generated method stub
System.out.println("체력 회복");
}
}
package concrete;
import framework.Item;
public class Mppotion implements Item{
@Override
public void use() {
// TODO Auto-generated method stub
System.out.println("마력 회복");
}
}
그 다음 이 HpPotion과 MpPotion을 생성해주는 ItemCreator를 상속하여 구현하는 HpCreator와 MpCreator를 만들어 줍시다.
package concrete/HpCreator.java,MpCreator.java
package concrete;
import java.util.Date;
import framework.Item;
import framework.ItemCreator;
public class HpCreator extends ItemCreator{
@Override
protected void requestItemsInfo() {
// TODO Auto-generated method stub
System.out.println("데이터베이스에서 회복 물약의 정보를 가져옵니다.");
}
@Override
protected void createItemLog() {
// TODO Auto-generated method stub
System.out.println("LOG.회복 물약을 새로 생성했습니다."+new Date());
}
@Override
protected Item createItem() {
// TODO Auto-generated method stub
return new HpPotion();
}
}
package concrete;
import java.util.Date;
import framework.Item;
import framework.ItemCreator;
public class MpCreator extends ItemCreator{
@Override
protected void requestItemsInfo() {
// TODO Auto-generated method stub
System.out.println("데이터베이스에서 마력 물약의 정보를 가져옵니다.");
}
@Override
protected void createItemLog() {
// TODO Auto-generated method stub
System.out.println("LOG.마력 물약을 새로 생성했습니다."+new Date());
}
@Override
protected Item createItem() {
// TODO Auto-generated method stub
return new Mppotion();
}
}
이제 마지막으로 사용할 Main.java를 작성합시다
package concrete;
import framework.Item;
import framework.ItemCreator;
public class Main {
public static void main(String[] args) {
ItemCreator creator;
Item hpitem;
Item mpitem;
creator = new HpCreator();
hpitem = creator.create(); //템플릿 팩토리 메소드
hpitem.use();
creator = new MpCreator();
mpitem = creator.create(); //템플릿 팩토리 메소드
mpitem.use();
}
}
결과
데이터베이스에서 회복 물약의 정보를 가져옵니다.
LOG.회복 물약을 새로 생성했습니다.Fri Aug 23 16:17:46 KST 2019
체력 회복
데이터베이스에서 마력 물약의 정보를 가져옵니다.
LOG.마력 물약을 새로 생성했습니다.Fri Aug 23 16:17:46 KST 2019
마력 회복
'프로그래밍 언어 > Java' 카테고리의 다른 글
디자인패턴- 싱글톤 패턴 (0) | 2019.08.24 |
---|---|
디자인패턴 - 전략패턴 (0) | 2019.08.23 |
디자인패턴- Adapter (0) | 2019.08.21 |
디자인 패턴- Template Method Pattern (0) | 2019.08.21 |
자바 공부(취업 준비) (0) | 2019.07.29 |