-----------------------------------------------------------------------------
[Prototype]
의도:
견본적(prototypical) 인스턴스를 사용하여 생성할 객체의 종류를 명시하고 이렇게 만들어진
견본을 복사해서 새로운 객체를 생성한다.
-----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//
// A creational part of GoF's Design Patterns
//
// - Prototype
//
/////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <tchar.h>
#include <iostream>
#include <memory>
/////////////////////////////////////////////////////////////////////////////
//
// Prototype
//
//
/////////////////////////////////////////////////////////////////////////////
class Product
{
public:
Product() {}
virtual ~Product() {}
public:
virtual Product* Clone (void) = 0;
virtual void Show (void) = 0;
};
class ConcreteProductA : public Product
{
public:
explicit ConcreteProductA(int v) : Value_(v) {}
virtual ~ConcreteProductA() {}
public:
virtual Product* Clone (void)
{
return new ConcreteProductA(Value_);
}
virtual void Show (void)
{
std::cout << "ConcreteProductA::Show(): " << Value_ << std::endl;
}
private:
int Value_;
};
class ConcreteProductB : public Product
{
public:
explicit ConcreteProductB(int v) : Value_(v) {}
virtual ~ConcreteProductB() {}
public:
virtual Product* Clone (void)
{
return new ConcreteProductB(Value_);
}
virtual void Show (void)
{
std::cout << "ConcreteProductB::Show(): " << Value_ << std::endl;
}
private:
int Value_;
};
/////////////////////////////////////////////////////////////////////////////
//
// Factory
//
//
/////////////////////////////////////////////////////////////////////////////
class ProductFactory
{
public:
ProductFactory()
{
ProductA_.reset ( new ConcreteProductA(100) );
ProductB_.reset ( new ConcreteProductB(200) );
}
public:
Product* CreateA (void)
{
return ProductA_->Clone();
}
Product* CreateB (void)
{
return ProductB_->Clone();
}
private:
std::auto_ptr<Product> ProductA_;
std::auto_ptr<Product> ProductB_;
};
/////////////////////////////////////////////////////////////////////////////
//
// Startup
//
//
/////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
std::auto_ptr<Product> p;
ProductFactory f;
p.reset ( f.CreateA() );
p->Show();
std::cout << std::endl;
p.reset ( f.CreateB() );
p->Show();
return 0;
}
ConcreteProductA::Show(): 100
ConcreteProductB::Show(): 200