[Design Pattern] GoF 생성 패턴 - 팩토리 메소드 패턴(Factory Method Pattern)



팩토리 메소드 패턴(Factory Method Pattern)

GoF 디자인 패턴 중 생성 패턴에 해당한다.
수퍼클래스에 알려지지 않은 클래스에 대해 서브클래스에서 어떤 객체를 생성할 지 결정하도록 하는 패턴이다. 수퍼클래스는 추상메소드 create를 정의하고, 서브클래스가 이를 재정의하여 객체를 생성한다. 이 때의 create메소드를 팩토리 메소드라고 한다.
추가로, 서브클래스는 수퍼클래스를 상속하지만 확장하지는 않는다는 점에 유의해야 한다.


사용법

  • 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 알지 못할 때
  • 객체의 생성을 서브클래스에게 위임하고 싶을 때


구조

img

  • Creator수퍼클래스를 정의하고 이를 상속받은 ConcreteCreator서브클래스를 구현한다.
  • ConcreteCreator는 factoryMethod()를 override하여 실체화하고 Product의 인스턴스를 반환한다.
  • 어떤 타입의 객체를 생성해야 하는지를 서브클래스가 결정할 수 있게 된다.


장점

  • 객체별로 서로 다른 메소드 제공
  • 병렬적인 클래스 계통을 연결할 수 있음


예제

클래스 다이어그램

img


패키지 구조

img


구현

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();
    }
}



:bookmark: REFERENCE
에릭 감마 외 3명, 「GoF의 디자인 패턴」, 피어슨에듀케이션코리아
팩토리 메서드 패턴