강의
https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4#
사전적 의미의 팩토리란??
무언가 물건을 만드는 공장을 의미한다. 팩토리 메소드 패턴도 뭔가 만드는(객체) 공장으로 이해하시면 됩니다.
팩토리메소드의 정의
객체 생성 처리를 서브 클래스로 분리 해 처리하도록 캡슐화하는 패턴이다. 즉, 객체의 생성 코드를 별도의 클래스/메서드로 분리함으로써 객체 생성의 변화에 대비하는 데 유용하고 확장성이 좋아진다는 장점이 있습니다..
팩토리 메소드 사용 이유는?
팩토리 메소드 패턴을 사용하는 이유는 클래스간의 결합도를 낮추기 위한것입니다. 결합도라는 것은 간단히 말해 클래스의 변경점이 생겼을 때 얼마나 다른 클래스에도 영향을 주는가입니다. 팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거합니다. 결과적으로 결합도 또한 낮출 수 있습니다.
<요구사항>
1. 게임 아이템과 아이템 생성을 구현해 주세요
- 아이템을 생성하기 전에 DB에서 아이템 정보 요청
- 아이템을 생성 후 아이템 복제 등의 불법을 방재하기 위해 DB에 아이템 생성 정보를 남김
2. 아이템을 생성하는 주체를 IterCreater로 이름 짓는다.
3. 아이템은 item이라는 interface로 다룰 수 있다.
- item은 use 함수를 기본 함수로 한다.
4. 현재 아이템의 종류는 체력 회복 물약, 마력 회복 물약이 있다.
framework.Item.java
public interface Item {
public void use();
}
framework.ItemCreater.java
public abstract class ItemCreateor {
// 이걸 팩토리 메소드 라고 하고 이 메소드를 포함하는 패턴을 팩토리 메소드 패턴이라 한다
-> 근데 이것이 템플릿 메소드와 같다
public Item create() {
Item item;
// step1
requestItemsInfo();
// step 2
item = createItem();
// step 3
createItemLog();
return item;
}
// 아이템을 생성하기전에 데이터베이스에서 아이템 정보 요청
abstract protected void requestItemsInfo();
// 아이템을 생성 후 아이템 복제 등의 불법을 방지하기 위한 메소드
abstract protected void createItemLog();
// 아이템을 생성하는 알고리즘
abstract protected Item createItem();
}
concrete.HpCreator.java
import java.util.Date;
import designpattern.chapter4.FactoryMethod_Pattern.framework.Item;
import designpattern.chapter4.FactoryMethod_Pattern.framework.ItemCreateor;
public class HpCreator extends ItemCreateor{
@Override
protected void requestItemsInfo() {
System.out.println("데이터베이스에서 체력 회복 물약의 정보를 가져옵니다");
}
@Override
protected void createItemLog() {
System.out.println("체력 회복 물약을 새로 생성 했습니다." + new Date());
}
@Override
protected Item createItem() {
// 작업
return new HpPotion();
}
}
concrete.HpPotion.java
public class HpPotion implements Item{
@Override
public void use() {
System.out.println("체력 회복 !!");
}
}
concrete.MpCreator
import java.util.Date;
import designpattern.chapter4.FactoryMethod_Pattern.framework.Item;
import designpattern.chapter4.FactoryMethod_Pattern.framework.ItemCreateor;
public class MpCreator extends ItemCreateor{
@Override
protected void requestItemsInfo() {
System.out.println("데이터베이스에서 마력 회복 물약의 정보를 가져옵니다");
}
@Override
protected void createItemLog() {
System.out.println("마력 회복 물약을 새로 생성 했습니다." + new Date());
}
@Override
protected Item createItem() {
// 작업
return new MpPotion();
}
}
concrete.MpPotion
public class MpPotion implements Item{
@Override
public void use() {
System.out.println("마력 회복 !!");
}
}
Main.java
public class Main {
public static void main(String[] args) {
ItemCreateor creator;
Item item;
creator = new HpCreator();
item = creator.create();
item.use();
creator = new MpCreator();
item = creator.create();
item.use();
}
}
참고
https://niceman.tistory.com/143
소스코드
https://github.com/garam-park/java-designpattern
'Java > design pattern' 카테고리의 다른 글
[java] 6강 프로토 타입 패턴(Prototype Pattern) (2) | 2020.01.22 |
---|---|
[java] 5강 싱글톤 패턴(singleton pattern) (0) | 2020.01.22 |
[java] 3강 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.01.13 |
[java] 2강 어댑터 패턴(adapter pattern) (0) | 2020.01.13 |
[java] 1강 스트래티지 패턴(strategy pattern) (0) | 2020.01.08 |