2009. 5. 17. 21:25

[펌글]Factory Method( 팩토리 )

출처 아브라카타부라 | 오빠택시
원문 http://blog.naver.com/sujioq/30014759540

Factory Method( 팩토리 )

같 은 부모를 상속하는 여러 종류의 객체를 생성할 필요가 있으며 각각의 객체들이 비슷한 일을 한다면 팩토리 패턴을 이용한다. 팩토리 패턴에게 객체 생성을 요청하면 적당한 객체를 대신 생성해 준다. 마치 공장에서 물건을 찍어내듯이 알아서 척척 객체를 대신 생성해 준다.

'타는것'이란 부모 클래스를 상속하는 자동차 클래스, 오토바이 클래스, 자전거 클래스가 있다고 하자. 그럼 다이어그램은 아래와 같을 것이다.


어 플리케이션에서 운전자를 포함해서 탑승인원이 2명 경우는 오토바이를 생성하고 3-4명인 경우는 자동차를 생성하고 5명 이상인 경우는 봉고 객체를 생성한다고 하자. 이때 팩토리 패턴을 사용하지 않을 경우 단체손님 클래스 내에서 인원수를 계산하여 알맞은 객체를 생성해야 한다. 아래의 코드와 같이 if-then-else문이나 switch 문을 이용하여 분기하여 적당한 객체를 생성해야 한다.



if( 인원수 <= 2 ) 타는 것 = new 오토바이
else if( 인원수 >2 and 인원수 4<= ) 타는 것 = new 자동차
else if( 인원수 > 5 ) 타는 것 = new 봉고




위와 같은 구조상에서 새로운 클래스가 추가된다고 하면 단체 손님 클래스 역시 추가된 만큼 if문을 추가 해야 한다. 이는 클래스 간의 의존성이 높게 만드는 구조이다. 팩토리 패턴을 이용하여 이 의존성을 제거할 수 있다.

팩토리 패턴으로 다이어그램을 다시 그려보자.



단 체 손님은 타는 것을 직접 생성하지 않고 객체의 생성을 팩토리에게 요청하면 된다. 파라미터로 인원수를 전달하면 팩토리는 인원수를 체크하여 봉고나 자동차 또는 오토바이 중에서 알맞은 객체를 생성하여 단체손님에게 다시 전달하는 구조로 되어 있다. 첫 번째 다이어그램의 위임 방법과 같은 점은 단체 손님에서 하던 인원수 체크를 팩토리에서도 해야 한다는 것이다. 메소드의 위치가 옮겨졌다고 볼수 있다. 다른 점은 단체 손님은 인원수에 상관하지 않고 그냥 팩토리에게 전달하면 적당한 객체를 생성해 준다는 것이다. 이때도 탈 것의 클래스가 새롭게 추가될수가 있는데 단체 손님은 이 점에 신경을 쓰지 않아도 되며 팩토리의 creator 메소드를 수정하여 새로운 객체를 생성하는 코드를 추가하면 된다.


추상팩토리 패턴

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

팩토리 메소드 패턴

객체를 생성하기 위한 인터페이스를 만듭니다. 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결정하도록 한다. 팩토리 메소드를 이용하면 인스턴스를 만드는 일을 서브 클래스로 미룰 수 있다.


위의 두 패넡은 모두 객체 생성을 캡슐화하기 위한 패턴이며, 클라이언트와 구상 클래스가 서로 분리된 유연한 디자인을 구현할 수 있게 해준다.
 
[정리]

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

'Programming 이론 > Design Pattern' 카테고리의 다른 글

[펌글]템플릿 메소드 패턴  (0) 2009.05.17
[펌글]퍼사드 패턴(Facade Pattern)  (0) 2009.05.17
[펌글]어댑터 패턴  (0) 2009.05.17
[펌글]커맨드 패턴  (0) 2009.05.17
[펌글]Singleton Pattern  (0) 2009.05.17