I. 의도
객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스에서 이루어지도록 한다. 설계를 재정의 가능한 것으로 하면서도 복잡해지지 않게 한다
정의 : 인스턴스를 생성하는 공장을 Template Method패턴으로 구성한 것이 Factory Method 패턴이다.
: 생성할 구상 클래스를 서브 클래스에서 결정
II. 활용
III. 결과
IV. 단점
관련 패턴: Abstract Factory 패턴은 Fatory Method를 이용해 구현하는 경우가 많다. Factory Method 패턴은 Template Method 패턴에서도 사용되는 경우가 많다
Product |
팩토리 메소드가 생성하는 객체의 인터페이스를 정의 |
ConcreteProduct |
Product 클래스에 정의된 인터페이스를 실제로 구현 |
Creator |
Product 타입의 객체를 반환하는 팩토리 메소드를 선언 |
ConcreteCreator |
ConcreteProduct의 인스턴스를 반환 하기 위해 팩토리 메소드를 재정의 |
예제코드
public class FactoryMethodTest {
public static void main(String[] args) {
Creator seoul = new ConcreteSeoulCreator();
seoul.anOperation("한국타이어");
Creator busan = new ConcreteBusanCreator();
busan.anOperation("금호타이어");
}
}
abstract class Creator {
public void anOperation(String type) {
//타이어조립 공정
Product product = factoryMethod(type);
product.make();
}
public abstract Product factoryMethod(String type);
}
class ConcreteSeoulCreator extends Creator {
@Override
public Product factoryMethod(String type) {
if(type.equals("한국타이어")) {
return new 한국타이어();
}
return null;
}
}
class ConcreteBusanCreator extends Creator {
@Override
public Product factoryMethod(String type) {
if(type.equals("금호타이어")) {
return new 금호타이어();
}
return null;
}
}
abstract class Product {
public abstract void make();
}
class 한국타이어 extends Product {
@Override
public void make() {
System.out.println("make 한국타이어");
}
}
class 금호타이어 extends Product {
@Override
public void make() {
System.out.println("make 금호타이어");
}
}