Factory Method Pattern (팩토리 메소드 패턴)
목적
사용 시나리오
- doc,hwp,ppt등 여러 파일을 생성해서 사용한다.
- 파일들을 생성할 때 항상 db로 부터 정보를 가져와서 파일을 만든다.
- 파일 생성이 완료되면 생성 완료됨을 db에 로그로 남긴다.
UML상에서 각각의 파일들 hwp,doc등은 ConcreteProduct에 해당한다.
이러한 파일들을 생성해주는 각각의 팩토리는 ConcreteCreator에 해당한다.
파일의 종류가 늘어났을 때는 베이스가 되는 클래스인 Creator와 Product를 상속하여 구체 클래스만 추가하면 된다.
[Product]
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]
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 |
Factory Method Pattern (팩토리 메소드 패턴)
목적
사용 시나리오
- doc,hwp,ppt등 여러 파일을 생성해서 사용한다.
- 파일들을 생성할 때 항상 db로 부터 정보를 가져와서 파일을 만든다.
- 파일 생성이 완료되면 생성 완료됨을 db에 로그로 남긴다.
UML상에서 각각의 파일들 hwp,doc등은 ConcreteProduct에 해당한다.
이러한 파일들을 생성해주는 각각의 팩토리는 ConcreteCreator에 해당한다.
파일의 종류가 늘어났을 때는 베이스가 되는 클래스인 Creator와 Product를 상속하여 구체 클래스만 추가하면 된다.
[Product]
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]
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 |