본문으로 바로가기

디자인패턴-팩토리메소드

category 프로그래밍 언어/Java 2019. 8. 23. 16:19

팩토리메소드

팩토리메소드는 앞서 배운 템플릿 메소드를 통해서 사용합니다.

2019/08/21 - [프로그래밍 언어/Java] - 디자인 패턴- Template Method Pattern

 

디자인 패턴- Template Method Pattern

Template Method Pattern 알고리즘 구조를 메소드에 정의 후 하위 클래스에서 알고리즘 구조의 변경 없이 알고리즘을 재정의 하는 패턴입니다. 즉 구현하려는 알고리즘이 프로세스가 있고, 변경 가능성이 있을 때..

dlwjdcks5343.tistory.com

즉 구현부와 구조를 나누고 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