글 작성자: 만렙개발자

Factory Method (팩토리 메소드)

펙토리 메소드 패턴은 객체 생성을 위한 런타임 인터페이스를 정의하는데 사용되는 디자인 패턴입니다.

Creational 디자인 패턴 중 하나로 객체 생성 메커니즘을 처리합니다.

 

어떤 종류의 객체를 만드는지 몰라도,

만드는 방법을 몰라도,

다양한 타입의 객체를 쉽게 만들 수 있기 때문에 팩토리라고 이름이 붙여졌습니다.

 

사용 목적

  • 하위 클래스가 런타임에 만들 객체 타입 선택 가능
  • 응용 프로그램 코드를 조금만 변경(minor changes)하여 객체의 family를 확장하는 간단한 방법을 제공
  • 응용 프로그램별 구조체를 코드에 바인딩할 필요가 없으므로 느슨한 커플링을 촉진

팩토리 메소드 디자인 패턴의 구성

 

저는 이 그림이 잘못된 것 같습니다! :(

 

  • Product: 팩토리 메소드가 만드는 객체의 인터페이스를 정의
  • ConcreteProduct: Product 인터페이스를 구현
  • Creator: Product 유형의 객체를 리턴하는 팩토리 메소드를 선언
  • ConcreteCreator: Concrete Product의 인스턴스를 리턴하기 위해 팩토리 메소드를 ovveride

팩토리 메소드의 예

팩토리 메소드는 객체를 만들기위한 인터페이스를 정의하지만, 서브클래스가 인스턴스화할 클래스를 결정할 수 있습니다. 레퍼런스 블로그에서는 Scalable Vector Graphics의 document 객체 모델을 만들기 위해서 팩토리 메소드 디자인 패턴을 채택했습니다.

 

간단하게는 동그라미와 사각형을 그리는 일을 하려는 겁니다. 동그라미와 사각형의 공통적으로 쓰일 함수 Draw가 있다고 생각해보죠. 그러면 Draw 함수를 갖는 shape라는 인터페이스를 선언합니다. 그리고 동그라미와 사각형이 Draw 함수를 갖고 있다면, shape 타입 통해 동그라미와 사격형 두 구조체를 다룰 수 있는 거죠. 즉, 어떤 구조체든 Draw 함수를 갖고 있는 것은 shape 타입에 넣을 수 있습니다. 이건 마치 C++에서 다이나믹 바인딩과 같은 것이죠.

 

클래스로 생각해보면 A(like shape)가 있고,

B(circle)이 A를 상속받고, C(rectangle)이 A를 상속받으면,

A 타입에 B와 C 모두를 넣을 수 있는 것 처럼 생각하시면 됩니다.

 

1. shape 인터페이스 선언 (Draw 함수를 갖는)

2. Circle 구조체와 Rectangle 구조체 선언 (Draw 함수를 갖는)

3. ShapeFactory 인터페이스 선언 (shape 타입을 리턴하는 create 함수를 갖는)

4. CircleFactory 구조체와 RectangleFactory 구조체 선언 (shape 타입을 리턴하는 create 함수를 갖는)

 

즉, 여기서는

 

Product는 Shape

ConcreteProduct는 Circle과 Rectangle

 

Creator는 ShapeFactory

ConcreteCreator는 CircleFactory와 RectangleFactory

 

가 될 것입니다.

추가적으로 AnOperation()은 Draw()로 생각하면 될 것 같습니다!

팩토리 메소드의 중요한 포인트

  • 구현시에 팩토리 메소드의 인수 설계를 잘 해야하고, 재사용성을 생각한 객체 풀을 고려해야합니다.

 

 

 

 

 

 

ref: http://blog.ralch.com/tutorial/design-patterns/golang-factory-method/