Factory method Pattern

fm1

1. 개요

이번에 알아볼 패턴은 ‘공장’을 뜻하는 ‘Factory’가 들어가 있다. 이게 무슨 뜻일까? 간단하다. 우리가 ‘new’키워드를 사용하여 어떠한 Object를 실제 메모리에 자리잡은 Instance를 만드는 것을 대신 하는 ‘공장’인 것이다.

정리하면 Instance를 생성하는 공장이 바로 ‘Factory method’ pattern 인 것이다. 이 패턴에서는 인스턴스를 만드는 방법을 부모 클래스에서 결정 하지만, 구체적인 클래스 이름까지는 결정하지 않는다. 구체적인 내용들은 모두 상속받은 자식 클래스에서 수행 하게 되는 것 이다. 따라서 인스턴스 생성을 위한 골격(Framework-Interface)과 실제 인스턴스 생성 클래스가 분리 되므로 유연성과 확장성이 뛰어나 리팩토링에  큰 장점을 가진 코드 제작이 가능 하다.

이는 전에 공부했었던 Template method pattern을 활용한 패턴 이라고 할 수 있다. 실제로 구현된 클래스나 아래에 나오는 UML다이어그램을 보면 템플릿 메소드 패턴이 그대로 사용되고 있음을 확인 할 수 있다.

 

2. 예제 및 설명

Factory method 패턴을 이용한 예제에 대해서 알아 보자. 이 예제 프로그램에서는 신분증명서 카드(ID 카드)를 만드는 공장을 소재로 한다.

fm1

framework / Product : framework 패키지의 ‘제품’ 을 표현한 추상 클래스.

추상메소드인 use()만 선언 되어 있다. 이 use()메소드의 구현은 상속하게 되는 자식 클래스에서 하게 될 것이다.

 

framework / Factory : framework 패키지의 제품을 ‘만들고’, ‘등록’ 하는 추상 클래스.

전에 배운 Template method 패턴이 사용 되고 있다. create()메소드에서 제품을 만들고 등록하는 과정이 순서대로 명시 되어 있다.

createProduct() : 제품을 만드는 추상 메소드로서 구현은 상속 받는 자식클래스에게 맡기고 있다.

registerProduct() : 제품을 등록하는 추상 메소드로 구현은 상속받는 자식클래스에게 맡기고 있다.

 

idcard / IDCard : idcard패키지의 IDCard클래스.

 

idcard / IDCardFactory  : idcard패키지의 IDCardFactory 클래스.

 

사용은 다음과 같다.

 

3. 정리 해 봅시다.

추상적인 골격(framework패키지의 추상클래스들)이 존재 했다면 그것을 상속받아 실제로 구현하는 구체적인 클래스(자식 클래스)들이 있다. 예제 프로그램에서는 new를 사용해서 실제의 인스턴스를 생성 하는게 아닌, 인스턴스 생성을 위한 메소드를 호출 함으로서 구체적인 클래스 이름에 의한 속박에서 부모 클래스를 자유롭게 만든다.

현재 framework 패키지를 idcard패키지의 클래스들이 상속받아 구현하였고 실제로 create 하고 use한다. 여기에서 idcard가 아닌 다른 물품, 예를 들어 televison이라는 패키지나 radio, 다른 클래스가 와도 똑같이 상속받아 추상메소드를 각자의 기능을 포함 한 형태로 구현을 하게 된다. 기능은 idcard와 다르지만 인스턴스를 생성(new)하고 create()하고 use()하는 과정은 똑같은 것 이다. 이를 표현 하자면, idcard 패키지는 상위 framework 패키지를 상속 받고 있지만 의존하고 있지 않다고 한다.

예제 프로그램에서는 추상 메소드를 이용해서 자식 클래스에서 구현하게 했었다. 허나 다른 방법들이 존재 한다.

디폴트의 구현을 준비 한다.

 

혹은 예외 처리를 활용 한다.

몰론 ‘FactoryMethodRuntimeException’예외가 별도로 존재 한다는 전제 하 이다.

 

템플릿 메소드와 팩토리 메소드 또한 둘 다 겉으로 봤을때엔 복잡해 보인다. 여러개의 클래스, 추상클래스들과 인터페이스, 그리고 패키지 까지 엮여 있으니 복잡해 보이는건 당연하다.

하지만 부모 클래스의 골격 개념과 자식 클래스의 구체화의 연결을 자세하게 들여다 보면 이해할 수 있을것이다. 또한 예제프로그램을 이용하여 패턴을 활용해서 구현해 보면 이해하기 더 편할 것 이다. 예제는 그나마 양이 적고 간단하여 이해하기 쉽지만 조금더 복잡하고 어려운 거대한 소스가 만들어 진다면 복잡 하고 이해하기 어려워 질 것이다.

만약 협업 중에 복잡한 디자인 패턴을 사용하게 되면 설계중에 다른 사람과도 공유할 필요가 있을 것 이라고 생각 된다.

 

 

 

참고 : Java언어로 배우는 디자인 패턴 입문

You may also like

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.