생성패턴 중 하나로써 동적으로 변환되는 객체를 효율적으로 활용하기 위해 상황에 맞는 객체를 반환한다. 팩토리 객체가 리턴하는 객체는 동적으로 변환되는 객체의 조상 객체인데, 실제로는 일반 객체가 조상 객체로 형변환 된 객체이다.
1) 문제 사례 설명
윈도우에서 문서 파일을 더블클릭한 경우를 생각해보자. 문서파일이름의 확장자에 따라 적절한 응용 프로그램이 실행될 것이다. 이런 동작 과정을 객체지향관점에서 살펴보면 두 가지 종류의 객체가 생성되어야 함을 알 수 있다. 그 하나는 응용 프로그램 객체고, 다른 하나는 더블클릭된 문서 파일에대한 객체이다. 즉 어떻게 운영체제가 호출하는 인터페이스는 응용 프로그램에 상관없이 동일하게 유지되면서, 응용 프로그래마다 생성되는 객체는 각 응용 프로그램마다 고유하게 만들어지도록 할 수 있을까??
2) 기본적인 방법 : 클래스별 멤버 함수 구현방식
- 각각의 응용 프로그램마다 고유의 객체를 생성하도록 만들기 위한 한 가지 해결방식은 응용 프로그램 클래스마다 NewDocument() 멤버함수를 만드는 것이다. HWPDocument 객체와 MsWordDocument객체는 각각 new연산자에 의해 직접적으로 생성된다.
3) Factory Method Pattern
클래스별 멤버 함수 구현방식은 다음과 같은 방식에서 다소 비효율적이다. HwpApplication클래스와 MsWordApplication클래스에서 구현한 NewDocument()멤버함수가 new 연산자호출하는 부분을 제외하고는 완전히 동일한데도 불구하고 각각 따로 구현되어 있다. 이같은 비효율성은 응용 프로그램의 갯수가 많아질수록 증가할 것이다. 또한 더욱 큰 문제는 newdocument() 멤버함수의 구현을 변경할 필요가 있는경우에는 각 응용 프로그램 클래스의 구현 내용을 일일이 변경해야 하는 문제가 발생한다. 즉 운영체제에게는 동일한 인터페이스를 제공하고 각 응용 프로그램에는 고유의 객체를 생성하면서도 객체 생성로직에 변화가 생길때 여러 곳을 수정할 필요없이 변경사항을 반영해줄 수 있는 방법은 없을까?
-> 객체를 생성하되 직접 객체 생성자를 호출해서 객체를 생성하는 것이 아니라 대행 함수를 간접적으로 객체를 생성하는 방식을 Factory Method 패턴이라고 한다.
4) 유용한 경우
- 어떤 클래스의 객체를 생성해야 할지 미리 알지 못한 경우
- 하위 클래스가 객체를 생성하기를 원할때
- 하위 클래스들에게 개별 객체의 생성 책임을 분산시켜 객체의 종류별로 객체 생성과 관련된 부분을 국지화시킬때
유용하다.
5) 장단점
- 어떤 객체를 생성할 것인지와는 무관하게 동일한 형태로 프로그래밍이 가능하다는 것이다.
- 직접 생성자를 호출하여 객체를 생성하는 것보다 훨씬 유연하고 확장성있는 구조라는 것이다.
- 생성할 객체의 종류가 달라질때마다 새로운 하위 클래스를 정의한다는 점이다.
6) 구현소스
1) 문제 사례 설명
윈도우에서 문서 파일을 더블클릭한 경우를 생각해보자. 문서파일이름의 확장자에 따라 적절한 응용 프로그램이 실행될 것이다. 이런 동작 과정을 객체지향관점에서 살펴보면 두 가지 종류의 객체가 생성되어야 함을 알 수 있다. 그 하나는 응용 프로그램 객체고, 다른 하나는 더블클릭된 문서 파일에대한 객체이다. 즉 어떻게 운영체제가 호출하는 인터페이스는 응용 프로그램에 상관없이 동일하게 유지되면서, 응용 프로그래마다 생성되는 객체는 각 응용 프로그램마다 고유하게 만들어지도록 할 수 있을까??
2) 기본적인 방법 : 클래스별 멤버 함수 구현방식
- 각각의 응용 프로그램마다 고유의 객체를 생성하도록 만들기 위한 한 가지 해결방식은 응용 프로그램 클래스마다 NewDocument() 멤버함수를 만드는 것이다. HWPDocument 객체와 MsWordDocument객체는 각각 new연산자에 의해 직접적으로 생성된다.
3) Factory Method Pattern
클래스별 멤버 함수 구현방식은 다음과 같은 방식에서 다소 비효율적이다. HwpApplication클래스와 MsWordApplication클래스에서 구현한 NewDocument()멤버함수가 new 연산자호출하는 부분을 제외하고는 완전히 동일한데도 불구하고 각각 따로 구현되어 있다. 이같은 비효율성은 응용 프로그램의 갯수가 많아질수록 증가할 것이다. 또한 더욱 큰 문제는 newdocument() 멤버함수의 구현을 변경할 필요가 있는경우에는 각 응용 프로그램 클래스의 구현 내용을 일일이 변경해야 하는 문제가 발생한다. 즉 운영체제에게는 동일한 인터페이스를 제공하고 각 응용 프로그램에는 고유의 객체를 생성하면서도 객체 생성로직에 변화가 생길때 여러 곳을 수정할 필요없이 변경사항을 반영해줄 수 있는 방법은 없을까?
-> 객체를 생성하되 직접 객체 생성자를 호출해서 객체를 생성하는 것이 아니라 대행 함수를 간접적으로 객체를 생성하는 방식을 Factory Method 패턴이라고 한다.
4) 유용한 경우
- 어떤 클래스의 객체를 생성해야 할지 미리 알지 못한 경우
- 하위 클래스가 객체를 생성하기를 원할때
- 하위 클래스들에게 개별 객체의 생성 책임을 분산시켜 객체의 종류별로 객체 생성과 관련된 부분을 국지화시킬때
유용하다.
5) 장단점
- 어떤 객체를 생성할 것인지와는 무관하게 동일한 형태로 프로그래밍이 가능하다는 것이다.
- 직접 생성자를 호출하여 객체를 생성하는 것보다 훨씬 유연하고 확장성있는 구조라는 것이다.
- 생성할 객체의 종류가 달라질때마다 새로운 하위 클래스를 정의한다는 점이다.
6) 구현소스