[Java Design Pattern] 자바 디자인패턴, 팩토리 메소드 패턴

팩토리 메소드 패턴

- 팩토리는 공장을 나타내는 단어. -> 뭔가를 생산.

- 객체를 직접 new 하지 않고 서브클래스에 위임해서 생성하는 기법.

- 객체를 만들어내는 팩토리 패턴.

- 팩토리 메소드에서는 주로 템플릿 메소드 패턴(하나의 알고리즘을 여러 단계의 알고리즘을 두고 사용하는 메소드 패턴)이 사용됨.

 

예제 분석

1. 게임아이템과 아이템 생성 구현 
 - 아이템을 생성하기 전 데이터베이스에서 아이템 정보 요청  
 - 아이템 생성 후 아이템 복제 등의 불법을 방지하기 위해 데이터베이스에 아이템 생성정보 남김 

2. 아이템을 생성하는 주체를 ItemCreator로 이름짓기 

3. 아이템은 Item이라는 interface로 다룰 수 있도록함. 
 - item은 use 함수를 기본 함수로 갖고 있습니다. 

4. 현재 아이템의 종류는 체력 회복 물약, 마력 회복 물약이 있습니다.

패키지 구조

 

1. 게임아이템과 아이템 생성 구현.

2. 아이템을 생성하는 주체를 ItemCreator로 이름짓기

3. 아이템은 Item이라는 interface로 다룰 수 있도록함.

public interface Item {
	public void use();
}

public abstract class ItemCreator {
	
	//팩토리 메소드 -> 템플릿 메소드
	public Item create() { //얘가 템플릿 메소드 패턴을 이용. -> 단계가 있음.
		Item item;
		//step1
		requestItemInfomation();
		
		//step2
		item = createItem();
		
		//step3
		createItemLog();
		
		return item;
	}
	
	//아이템을 생성하기 전에 데이터베이스에서 아이템정보를 요청
	abstract protected void requestItemInfomation();
	
	//아이템을 생성 후 아이템 복제등의 불법을 방지하기 위해 데이터베이스에 아이템 생성 정보를 남깁니다.
	abstract protected void createItemLog();
	
	//아이템을 생성하는 알고리즘
	abstract protected Item createItem();
}

- create() 메소드는 Item 객체를 만들어내는 팩토리 메소드

- 추상클래스 ItemCreator의 추상메소드는 구현객체에서 각각의 알고리즘을 가지고 구현이됨(아이템마다 생성 패턴이 다를테니)

 

4. 현재 아이템의 종류는 체력 회복 물약, 마력 회복 물약이 있습니다. (편의상 체력물약만 포스팅하고 마력물약은 생각해보시길)

public class HPCreator extends ItemCreator{

	@Override
	protected void requestItemInfomation() {
		System.out.println("데이터베이스에서 체력 회복 물약의 정보를 가져온다.");
	}

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

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

} //체력회복물약 Creator

public class HPPotion implements Item{

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

- 각각 ItemCreator와 Item을 상속, 구현하여서 구현객체를 생성.

- 추상메소드를 구현한다.

- createItem 메소드를 보면 객체 생성은 서브클래스에서 이루어지는 것을 볼 수 있다.(서브클래스는 ItemCreator에 선언된 createItem메소드는 직접 객체를 생성하지 않고 구현객체인 서브클래스단에서 직접 생성하게 한다는 것.

 

5. 실행

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

 

장점 -> 구조와 구현을 분리, 추후에 다른 아이템이 추가가 될때 다른 소스의 변경없이 클래스를 추가하는 것과 추가된 아이템에 대한 소스추가밖에 수정할 부분이 없다. -> 소스의 유연성이 증가한다.

 

댓글

Designed by JB FACTORY