팩토리 패턴 (Factory Pattern)

팩토리 패턴의 목적은 객체들을 생성하는 것입니다.
팩토리 패턴은 흔히 클래스 내부 또는 클래스의 스태틱 메서드로 구현되며 다음과 같은 목적으로 사용됩니다.

  • 비슷한 객체를 생성하는 반복 작업을 수행한다.
  • 팩토리 패턴의 사용자가 컴파일 타임에 구체적인 타입을 모르고도 객체를 생성할 수 있게 해준다.
  • 결합을 느슨하게 한다. (Loose coupling)

구현

var joyCar = CarMaker.factory('i8');
var myCar = CarMaker.factory('520D');
var wifeCar = CarMaker.factory('320D');

joyCar.drive();
myCar.drive();
wifeCar.drive();

활용 예

  • 생성할 객체 타입을 예측할 수 없을 때 ==> 부모 클래스 타입을 이용
  • 생성할 객체의 명세를 하위 클래스에서 정의하고자 하는 경우
  • 객체 생성의 책임을 하위 클래스에 위임시키고 어느 하위 클래스가 위임했는지에 대한 정보를 은닉하고자 하는 경우

팩토리 메서드 패턴

팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 합니다.
팩토리 메서드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브 클레스에 맡기게 됩니다.

factory screenshot

추상 팩토리 패턴 (Abstract Factory Pattern)

서로 연관된 또는 의존적인 객체들로 이루어진 제품군을 생성하기 위한 인터페이스를 제공합니다.
구상 클래스는 서브 클래스에 의해서 만들어집니다.

factory screenshot

차이점

  • 팩토리 메소드 패턴은 클래스를 써서 제품을 만들고 추상 팩토리 패턴은 객체를 써서 제품을 만듭니다.
  • 팩토리 메소드 패턴은 상속을 통해서 객체를 만들고 추상 팩토리 패턴은 객체 구성을 통해 만듭니다.
  • 팩토리 메소드 패턴을 통해 객체를 생성할 때는 클래스를 확장하고 팩토리 메소드를 오버라이드 해야합니다.
  • 팩토리 메소드 패턴은 사용하는 것은 서브클래스를 통해서 객체를 만들기 위한 것입니다.
  • 클라이언트는 자신이 사용할 추상 형식만 알면 되고 구상 형식은 서브클래스에서 처리해 줍니다.
  • 클라이언트와 구상 형식을 분리시켜주는 역할을 합니다.
  • 추상팩토리 패턴은 제품군을 만들기 위한 추상 형식을 제공합니다.
  • 제품이 생산되는 방법은 이 형식의 서브클래스에서 정의됩니다. 팩토리를 이용하고 싶으면 일단 인스턴스를 만든 다음 추상 형식을 써서 만든 코드에 전달합니다.
  • 팩토리 메소드 패턴을 쓸 때와 마찬가지로 클라이언트와 클라이언트에서 사용하는 실제 구상 제품이 분리됩니다.

정리해보면

  • 팩토리를 쓰면 객체 생성을 캡슐화할 수 있다.
  • 간단한 팩토리는 엄밀하게 말해서 디자인 패턴은 아니지만, 클라이언트와 구상캘르스를 분리시키기 위한 간단한 기법으로 활용할 수 있다.
  • 팩토리 메소드 패턴에서는 상속을 활용한다. 객체 생성이 서브클래스에게 위임되고, 서브클래스에서는 팩토리 메소드를 구현하여 객체를 생선한다.
  • 추상 팩토리 패턴에서는 객체구성을 활용한다. 객체 생성이 팩토리 인터페이스에서 선언한 메소드들에서 구현된다.
  • 모든 팩토리 패턴에서는 애플리케이션의 구상 클래스에 대한 의존성을 줄여줌으로써 느슨한 결합을 도와준다.
  • 팩토리 메소드 패턴에서는 어떤 클래스에서 인스턴스를 만드는일을 서브클래스한테 넘긴다.
  • 추상 팩토리 패턴은 구상 클래스에 직접 의존하지 않고도 서로 관련된 객체들로 이루어진 제품군을 만들기 위한 용도로 쓰인다.
  • 의존성 뒤집기 원칙을 따르면 구상 형식에 대한 의존을 피하고 추상화를 지향할 수 있다.
  • 팩토리는 구상 클래스가 아닌 추상 클래스/인터페이스에 맞춰서 코딩할 수 있게 해 주는 강력한 기법이다.