본문 바로가기
DesignPattern

[Design Pattern] Factory Method Pattern

by 봄석 2019. 9. 18.

[Design Pattern] Factory Method Pattern

 

Factory Method Pattern이란?

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

Factory method pattern은 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며.

자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 

 

팩토리 메서드 패턴은 아래와 같은 특징, 장단점이 존재합니다.

 

 

특징 

  1. Templeate Method Pattern을 사용
  2. Factory 클래스를 이용하여 객체 생성
  3. 추상적인 클래스( interface, abstract )를 통해 실제 구현 대상인 Concrete(구상 클래스, 구체 클래스)와 Client 간의 결합도를 낮춥니다.
  4. 단 하나의 메서드로 여러 개의 종류의 객체를 생성합니다.
    1. 그 메서드의 인자에 따라 생성되는 객체가 결정됩니다.
  5.  abstract, interface을 활용해 객체 생성을 서브 클래스에 위임
    1. 서브 클래스는 팩토리 메서드를 구현해 객체를 생성
  6. 하위 클래스에서 객체를 생성하는데, 상위 클래스에서는 그 객체에 대하여 정확한 타입을 몰라도 됩니다.

 

 

장점

  1. 객체의 자료형이 하위 클래스 의해서 결정됨 -> 확장에 용이함
    1. 하위 클래스에서 객체를 생성할 때 , 상위 클래스에서 그 객체에 대한 정확한 타입을 몰라도 됩니다.(위의 특징)
  2. 동일한 형태로 프로그래밍 가능함
  3. 확장성 있는 전체 프로젝트 구성 가능함
  4. 구상 클래스에 의존하지 않고 추상화된 것에 의존한다(디자인 원칙 준수)

단점

  1. 객체가 늘어날 때마다 하위 클래스 재정의로 인한 불필요한 많은 클래스 생성 가능성이 있음

 

결국 위 내용들은 하나의 결론을 풀어놓은 거라 볼 수 있습니다.

의존 관계 역전 원칙(Dependency inversion principle)을 성립하게 됩니다.

 

즉, 상위와 하위 객체는 구상 클래스에 의존하지 않고, 모두 동일한 추상화에 의존하게 되어 원칙을 성립하게 됩니다.

아래 예의 클래스들의 관계는 아래와 같이 정리할 수 있습니다.

ShapeFactory ->Shape

Shape <-Circle, Ractangle, Square

 

 

 

 

<팩토리 메서드 패턴 구조>

Creator : 창조자 , ConcreteCreate :구성자 

 

 

팩토리 메소드 패턴 예를 봐보도록 하겠습니다.

자바에서는 추상화 방법으로 interface와 abstract둘다 사용 가능합니다.

이 예에서는 interface를 사용합니다.

 

public interface Shape {
    void draw();
}

 

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Circle - draw");
    }
}
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Rectangle - draw");
    }
}
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Square - draw");
    }
}

 

public enum ShapeType {
    CIRCLE,RECTANGLE,SQUARE
}

 

public class ShapeFactory {
    public Shape getShape(ShapeType shapeType) {
        switch (shapeType) {
            case CIRCLE:
                return new Circle();
            case SQUARE:
                return new Square();
            case RECTANGLE:
                return new Rectangle();
            default:
                return null;
        }
    }
}

 

팩토리 메서드 패턴을 사용할 때 이점이 무엇이 있을까요?

바로 결합도를 낮춰서 얻을 수 있는 이점이라 보시면 됩니다.

객체 생성을 팩토리에 위임함으로써 구상 클래스(구체 클래스와)와 클라이언트와의 결합도를 낮춥니다.

 

 팩토리 메서드 패턴은 직접 사용하는 객체를 생성하지 않고 팩토리 메수트 클래스를 통해 객체를 대신 생성시키고

그 객체를 반환받아 사용하기 때문에 효율적인 코드 제어를 할 수 있을뿐더러 결합도를 낮춰 유지보수가 용이합니다.

 

댓글