ABSTRACT FACTORY 추상 팩토리 패턴

  • 서로 관련있거나 독리정인 여러 객체군을 생성 하는데 이용.



#include <iostream> using namespace std; class AbstractProductA{ public: virtual void print() = 0; }; class AbstractProductB{ public: virtual void print() = 0; }; class ConcreteProductA1 : public AbstractProductA{ private: void print() { cout << "ConcreteProduct A1" << endl; } }; class ConcreteProductA2: public AbstractProductA{ private: void print() { cout << "ConcreteProduct A2" << endl; } }; class ConcreteProductB1 : public AbstractProductB{ private: void print() { cout << "ConcreteProduct B1" << endl; } }; class ConcreteProductB2 : public AbstractProductB{ private: void print() { cout << "ConcreteProduct B2" << endl; } }; class AbstractFactory{ public: virtual AbstractProductA* createProductA() = 0; virtual AbstractProductB* createProductB() = 0; }; class ConcreteFactory1 : public AbstractFactory{ public: AbstractProductA* createProductA() { return new ConcreteProductA1; } AbstractProductB* createProductB() { return new ConcreteProductB1; } }; class ConcreteFactory2 : public AbstractFactory{ public: AbstractProductA* createProductA() { return new ConcreteProductA2; } AbstractProductB* createProductB() { return new ConcreteProductB2; } }; int main(){ ConcreteFactory1 factory1; ConcreteFactory2 factory2; AbstractProductA* A1 = factory1.createProductA(); A1->print(); AbstractProductB* B1 = factory1.createProductB(); B1->print(); AbstractProductA* A2 = factory2.createProductA(); A2->print(); AbstractProductB* B2 = factory2.createProductB(); B2->print(); delete A1; delete B1; delete A2; delete B2; return 0; }


템플릿을 이용한 ConcreteFactory 수 줄이기. template <typename T> class AbstractFactory{ public: virtual T* createProduct() = 0; }; template<typename T1, typename T2> class ConcreteFactory : public AbstractFactory<T1>{ public: T1* createProduct() { return new T2; } }; int main(){ ConcreteFactory<AbstractProductA,ConcreteProductA1> factory1; ConcreteFactory<AbstractProductB,ConcreteProductB1> factory2; ConcreteFactory<AbstractProductA,ConcreteProductA2> factory3; ConcreteFactory<AbstractProductB,ConcreteProductB2> factory4; AbstractProductA* a = factory1.createProduct(); AbstractProductB* b = factory2.createProduct(); AbstractProductA* c = factory3.createProduct(); AbstractProductB* d = factory4.createProduct(); a->print(); b->print(); c->print(); d->print(); }


+ Recent posts