팩토리 메소드 패턴(Factory Method Pattern)
GoF 디자인 패턴 중 생성 패턴에 해당한다.
수퍼클래스에 알려지지 않은 클래스에 대해 서브클래스에서 어떤 객체를 생성할 지 결정하도록 하는 패턴이다.
수퍼클래스는 추상메소드 create
를 정의하고, 서브클래스가 이를 재정의하여 객체를 생성한다. 이 때의 create메소드를 팩토리 메소드라고 한다.
추가로, 서브클래스는 수퍼클래스를 상속하지만 확장하지는 않는다는 점에 유의해야 한다.
사용법
- 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 알지 못할 때
- 객체의 생성을 서브클래스에게 위임하고 싶을 때
구조
- Creator수퍼클래스를 정의하고 이를 상속받은 ConcreteCreator서브클래스를 구현한다.
- ConcreteCreator는 factoryMethod()를 override하여 실체화하고 Product의 인스턴스를 반환한다.
- 어떤 타입의 객체를 생성해야 하는지를 서브클래스가 결정할 수 있게 된다.
장점
- 객체별로 서로 다른 메소드 제공
- 병렬적인 클래스 계통을 연결할 수 있음
예제
클래스 다이어그램
패키지 구조
구현
Creator수퍼클래스를 상속받아 구체화한 클래스에서 Shape을 생성하는 메소드인 createShape()
를 재정의한다. Creator의 팩토리 메소드를 통해 알맞은 클래스의 인스턴스를 생성하여 반환할 수 있다.
CircleCreator circleCreator = new CircleCreator();
RectangleCreator rectangleCreator = new RectangleCreator();
Shape circle = circleCreator.createShape();
circle.print();
Shape rectangle = rectangleCreator.createShape();
rectangle.print();
[실행 결과]
Create Circle...
Draw Circle...
>> Circle
Create Rectangle...
Draw Rectangle...
>> Rectangle
소스 코드
package creator.abst;
import product.abst.Shape;
public abstract class ShapeCreator {
public Shape createShape(){
Shape shape = create();
draw();
return shape;
}
/* factory method */
public abstract Shape create();
/* operation */
public abstract void draw();
}
package creator.concrete;
import creator.abst.ShapeCreator;
import product.abst.Shape;
import product.concrete.Circle;
public class CircleCreator extends ShapeCreator {
@Override
public Shape create() {
System.out.println("Create Circle...");
return new Circle();
}
@Override
public void draw() {
System.out.println("Draw Circle...");
}
}
package product.abst;
public interface Shape {
void print();
}
package product.concrete;
import product.abst.Shape;
public class Circle implements Shape {
@Override
public void print() {
System.out.println(">> Circle\n");
}
}
import creator.concrete.CircleCreator;
import creator.concrete.RectangleCreator;
import product.abst.Shape;
public class Main {
public static void main(String[] args) {
CircleCreator circleCreator = new CircleCreator();
RectangleCreator rectangleCreator = new RectangleCreator();
Shape circle = circleCreator.createShape();
circle.print();
Shape rectangle = rectangleCreator.createShape();
rectangle.print();
}
}
REFERENCE
에릭 감마 외 3명, 「GoF의 디자인 패턴」, 피어슨에듀케이션코리아
팩토리 메서드 패턴