본문 바로가기

취업과 기본기 튼튼/빽 투더 기본기

[디자인 패턴 3편] 생성 패턴, 팩토리 메쏘드 (Factory)

1. 개념

팩토리 패턴은 인터페이스로 객체들을 정의하고,
팩토리가 인스턴스를 생성하는 패턴이다.

1.1. 장점

  • 객체 생성 하는 코드를 분리하여 클라이언트 코드와 결합도(의존성)를 낮춤.
    • 코드에 변경이 필요할 시, 객체 생성 클래스만 수정하면 된다.
  • 인터페이스를 바탕으로 유연성과 확장성이 뛰어난 코드 제작이 가능
  • 객체의 자료형이 하위 클래스 의해서 결정됨
    • 확장에 용이함
    • 상위 클래스에서 그 객체에 대한 정확한 타입을 몰라도 된다.
  • SOLID 원칙 중 DIP (Dependency Inversion Principle, 의존 관계 역전 원칙) 를 성립함

1.2. 단점

  • 새로 생성할 객체의 종류가 늘어날 때마다, 클래스가 많아짐.

1.3. 활용 상황

  • 딱히 구분없이 일반적으로 많이 사용됨.
  • 대표적인 것이 JAVA 의 스프링 프레임워크.

 

2. 구조

출처 : tutorialpoints.com

 

3. 코드

메인에서, 사용자는 다음과 같이 사용할 수 있다.

// FactoryPatternDemo.java

public class FactoryPatternDemo {
  public static void main(String[] args) {
    // Shape 인스턴스를 생성해주는 팩토리를 만듭니다.
    ShapeFactory shapeFactory = new ShapeFactory();

    // 팩토리로부터 생성할 객체를 팩토리 메쏘드로 받습니다. 
    Shape shape1 = shapeFactory.getShape("CIRCLE");
    shape1.draw();

    Shape shape2 = shapeFactory.getShape("RECTANGLE");
    shape2.draw();
  }
}

뒷 단은 다음과 같이 구성되어 있다.
먼저, Factory 에서 만들어낼 상품(개체)들을 정의한다.

// Shape.java

// Shape 는 상위 클래스(인터페이스)로, 서브 클래스들은 모두 이에 의존하게 됩니다.
public interface Shape {
  void draw();
}
// Circle.java

public class Circle implements Shape {

  @Override
  public void draw() {
    System.out.println("Inside Circle::draw() method.");
  }
}
// Rectangle.java

public class Square implements Shape {

  @Override
  public void draw() {
    System.out.println("Inside Rectangle::draw() method.");
  }
}

이제, 이 상품들을 만들어 내보낼 팩토리를 정의한다.

// ShapeFactory.java

public class ShapeFactory {

  // getShape(...) 를 통해 상품(Shape) 를 새로 만들어 내보냅니다.
  public Shape getShape(String shapeType) {
    if (ShapeType.equalsIgnoreCase("CIRCLE"))
      return new Circle();
    else if (ShapeType.equalsIgnoreCase("RECTANGLE"))
      return new Rectangle();
    else
      return null
  }
}

 

4. 참고