FactoryMethod :
객체를 생성하기 위한 인터페이스를 정의하고, 어떤 클래스의 인스턴스를 생성할지에 대한 처리는 서브클래스가 결정하는 디자인 패턴
객체 생성 처리를 서브 클래스로 분리 해 처리하도록 캡슐화하는 패턴
객체의 생성 코드를 별도 분리함으로써 객체 생성의 변화에 대비하는 데 유용함
역할이 수행하는 작업 Product
팩토리 메서드로 생성될 객체의 공통 인터페이스 ConcreteProduct = Default
구체적으로 객체가 생성되는 클래스 Creator
팩토리 메서드를 갖는 클래스 ConcreteCreator
팩토리 메서드를 구현하는 클래스로 ConcreteProduct 객체를 생성 = Default
https://gmlwjd9405.github.io/2018/08/07/factory-method-pattern.html
역할을 수행하는 작업인 Product (Interface Item)
package FactoryMethod.framework;
public interface Item {
public void use();
}
구체적으로 객체가 생성되는 Creator
package FactoryMethod.framework;
public abstract class ItemCreator {
// 메소드에서 필요한 알고리즘을 단계별로 나눠주고 차례대로 실행하는 형식 > 팩토리메소드
public Item create() {
Item item;
requestItemsInfo(); // 1. 데베에서 아이템정보 호출하고
item = createItem();// 2. 아이템 생성
createItemLog(); // 3. 로그 호출
// 위 부분이 템플릿메소드 이다
return item;
}
// 아이템 정보 요청
abstract protected void requestItemsInfo();
//데베에 아이템 생성
abstract protected void createItemLog();
// 아이템 생서 알고리즘
abstract protected Item createItem();
}
이 Creator 안에는 이 전에 배웠던 템플릿 메서드가 사용된다.
메소드에서 필요한 알고리즘을 단계별로 나눠주고 하위 클래스에서 구체적으로 구현하는 템플릿 메서드가 말이다.
creator 를 상속받아 DefaultCreator 를 구현하는것
package FactoryMethod.concrete;
import FactoryMethod.framework.Item;
import FactoryMethod.framework.ItemCreator;
import java.util.Date;
public class HpCreator extends ItemCreator {
@Override
protected void requestItemsInfo() {
System.out.println("데이터베이스에서 회복 물약의 정보를 가져옴");
}
@Override
protected void createItemLog() {
System.out.println("데이터베이스에서 회복 물약을 새로 생성" + new Date());
}
@Override
protected Item createItem() {
return new Hppotion();
}
}
package FactoryMethod.concrete;
import FactoryMethod.framework.Item;
import FactoryMethod.framework.ItemCreator;
import java.util.Date;
public class MpCreator extends ItemCreator {
@Override
protected void requestItemsInfo() {
System.out.println("데이터베이스에서 마력 물약의 정보를 가져옴");
}
@Override
protected void createItemLog() {
System.out.println("데이터베이스에서 마력 물약을 새로 생성" + new Date());
}
@Override
protected Item createItem() {
return new Mppotion();
}
}
Default
package FactoryMethod.concrete;
import FactoryMethod.framework.Item;
public class Hppotion implements Item {
@Override
public void use() {
System.out.println("체력 회복");
}
}
package FactoryMethod.concrete;
import FactoryMethod.framework.Item;
public class Mppotion implements Item {
@Override
public void use() {
System.out.println("마력 회복");
}
}
팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거한다. 결과적으로 결합도 또한 낮출 수 있다.
팩토리 메소드 패턴은 부모 클래스에 알려지지 않은 구체 클래스를 생성 하는 패턴 이며 클래스가 어떤 객체를 생성할지를 결정한다.
위 예제로 보면
mpCreator, HpCreator 이 추상메서드를 구현하는 클래스이고
HpPotion, MpPotion 은 Item 에 대한 구현 클래스이다.
Item과 ItemCreator 은 생성에 대한 인터페이스 부분 이고
나머지는 구현에 대한 부분
생성에 대한 인터페이스와 생성에대한 구현부분이 완전히 분리되어있다 .
>> 인터페이스 부분이 구현부분을 전혀 모르고 있다.
즉 필요하다면 인터페이스 부분만 별도의 패키지로 분리해서 개발할수있다. (구현부분도 마찬가지)
댓글