반응형
Factory Method Pattern (팩토리 메소드 패턴)
목적
객체 생성을 서브클래스에 위임하고 객체 생성단계에서 필요한 공통적인 부분을 모아 구조화 한다.
이러한 구조화 과정에서 Template Method Pattern이 사용된다. (NVI와 일맥상통)
결론적으로 Template Method를 활용하여 객체를 생성하는 패턴이다.
사용 시나리오
아래와 같은 기능을 만든다고 생각해보면
- doc,hwp,ppt등 여러 파일을 생성해서 사용한다.
- 파일들을 생성할 때 항상 db로 부터 정보를 가져와서 파일을 만든다.
- 파일 생성이 완료되면 생성 완료됨을 db에 로그로 남긴다.
UML상에서 각각의 파일들 hwp,doc등은 ConcreteProduct에 해당한다.
이러한 파일들을 생성해주는 각각의 팩토리는 ConcreteCreator에 해당한다.
파일의 종류가 늘어났을 때는 베이스가 되는 클래스인 Creator와 Product를 상속하여 구체 클래스만 추가하면 된다.
[Product]
BaseFile 클래스를 통해 파일을 추상화 한다.
class BaseFile { public: virtual void Use() = 0; virtual ~BaseFile(){} };
[ConcreteProduct]
BaseFile을 상속하여 구체적인 파일을(이번 예에선 hwp파일과 doc파일) 정의한다.
class HwpFile : public BaseFile { public: virtual void Use() { cout<<"Use HwpFile"<<endl; } }; class DocFile : public BaseFile { public: virtual void Use() { cout<<"Use DocFile"<<endl; } };
[Creator]
기본 Factory역할을 할 BaseFactory를 정의한다.
CreateFile() 함수에서 템플릿 메소드 패턴이 적용된다. 템플릿 메소드 패턴을 통해 일련의 과정을 구조화 한다.
1) DB에서 data를 얻는다. GetDataFromDB()
2) 파일객체를 생성한다 CreateNewFile()
3) 생성완료됨을 로그로 저장한다. SaveLog()
class BaseFileFactory { public: BaseFile* CreateFile() {//factory method GetDataFromDB(); BaseFile* baseFile = CreateNewFile(); SaveLog(); return baseFile; } virtual ~BaseFileFactory() { } private: virtual void GetDataFromDB() = 0; virtual BaseFile* CreateNewFile() = 0; virtual void SaveLog() = 0; };
[ConcreteCreator]
각 파일들을 생성해서 Client로(이번 예에서는 main 함수) 넘겨주는 실제 팩토리를 정의한다.
class HwpFileFactory : public BaseFileFactory { private: virtual void GetDataFromDB() { cout<<"Hwp file GetDataFromDB"<<endl; } virtual BaseFile* CreateNewFile() { cout<<"Hwp file CreateNewFile"<<endl; return new DocFile(); } virtual void SaveLog() { cout<<"Hwp file SaveLog"<<endl; } }; class DocFileFactory : public BaseFileFactory { private: virtual void GetDataFromDB() { cout<<"Doc file GetDataFromDB"<<endl; } virtual BaseFile* CreateNewFile() { cout<<"Doc file CreateNewFile"<<endl; return new DocFile(); } virtual void SaveLog() { cout<<"Doc file SaveLog"<<endl; } };
[사용 예]
int main(int argc, const char * argv[]) { BaseFileFactory* factory = new DocFileFactory(); BaseFile* file = factory->CreateFile(); file->Use(); delete factory; delete file; factory = new HwpFileFactory(); file = factory->CreateFile(); file->Use(); return 0; }
실행결과
Doc file GetDataFromDB
Doc file CreateNewFile
Doc file SaveLog
Use DocFile
Hwp file GetDataFromDB
Hwp file CreateNewFile
Hwp file SaveLog
Use DocFile
반응형
'Design Patterns > Creational Patterns' 카테고리의 다른 글
Singleton Pattern (C++) (0) | 2019.09.28 |
---|---|
Prototype Pattern (C++) (0) | 2019.09.13 |
Builder Pattern (C++) (0) | 2019.08.24 |
Abstract Factory Pattern (C++) (0) | 2018.11.17 |
Creational Pattern (생성 패턴) (0) | 2018.11.11 |