Computer Science/Design Pattern

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

dbssk 2023. 9. 23. 14:35

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

  • 객체 생성을 클라이언트 코드로부터 분리하고, 객체의 생성 방식을 하위 클래스에 위임하는 패턴
  • 사용 방법
    • 인터페이스나 추상 클래스를 사용하여 팩토리를 정의
    • 인터페이스/추상 클래스를 상속하는 하위 클래스에서 팩토리 메소드 구현
    • 클라이언트 코드에서는 인터페이스/추상 클래스를 통해 객체를 생성하며, 구체적인 팩토리 클래스는 런타임에 선택되거나 주입 

  • 장점
    • 확장성 : 팩토리 클래스를 확장하여 객체 생성 로직을 쉽게 변경하거나 다양한 조건에 따라 객체 생성을 커스터마이징 할 수 있다. → 개방-폐쇄 원칙(OCP)

  • 단점
    • 복잡성 : 클래스 계층 구조가 더 복잡해 질 수 있다.

 

구현 코드

// Step 1: 팩토리 인터페이스
interface ShapeFactory {
    Shape createShape();
}

// Step 2: 구체적인 팩토리 클래스 1 - 원을 생성하는 팩토리
class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

// Step 3: 구체적인 팩토리 클래스 2 - 사각형을 생성하는 팩토리
class RectangleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

// Step 4: 추상 생성 클래스
abstract class Shape {
    abstract void draw();
}

// Step 5: 구체적인 생성 클래스 1 - 원
class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("원을 그립니다.");
    }
}

// Step 6: 구체적인 생성 클래스 2 - 사각형
class Rectangle extends Shape {
    @Override
    void draw() {
        System.out.println("사각형을 그립니다.");
    }
}

// 클라이언트 코드
public class FactoryMethodDemo {
    public static void main(String[] args) {
        // 원을 생성하는 팩토리
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw();

        // 사각형을 생성하는 팩토리
        ShapeFactory rectangleFactory = new RectangleFactory();
        Shape rectangle = rectangleFactory.createShape();
        rectangle.draw();
    }
}

'ShapeFactory' 인터페이스를 사용하여 도형을 생성하는 팩토리를 정의하고, 각 도형에 대한 구체적인 팩토리 클래스('CircleFactory'와 'RectangleFactory')를 구현한다. 클라이언트 코드에서는 팩토리를 사용하여 도형을 생성하고, 각 도형 클래스('Circle'과 'Rectangle')는 공통 메소드 'draw()'를 구현한다.