#include <iostream>
using namespace std;
// factory : 객체 생성을 클래스화 해라.
// 도형 편집기를 만들고 싶다.
class Shape { };
class Rect : public Shape {};
class Circle : public Shape {};
// 이제 도형을 생성하는 공장의 인터페이스를 구현한다.
class IShapeFactory
{
public:
        virtual Shape* CreateShape( char c ) = 0;
};
class FactoryVer1 : public IShapeFactory
{
public:
        virtual Shape* CreateShape( char c )
        {
               switch( c )
               {
               case 'C':
                       return new Circle;
               case 'R':
                       return new Rect;
               }
        }
};
class FactoryVer2 : public IShapeFactory
{
public:
        virtual Shape* CreateShape( char c )
        {
               switch( c )
               {
               case 'C':
                       return new Circle;
               case 'R':
                       return new Rect;
               case 'T':
                       return new Triangle;   // 확장의 유용성!!
               }
        }
};
class Canvas
{
        vector<Shape*> shapes;
        IShapeFactory* factory;
public:
        void Save()
        {
        }
        void Load()
        {
               // 어떤 객체인지 표시를 읽어내고, 해당 data를 읽은 후에
               char c = Read();
               char data = Read();
               shapes.push_back( factory->CreateShape( c ) ); // 위임한다.
               //switch( c )
               //{
               //case 'R':
               //      shapes.push_back( new Rect(data) );
               //      break;
               //case 'C':
               //      shapes.push_back( new Circle(data) );
               //      break;
               //}
        }
        void KeyDown( char c )
        {
               shape.push_back( factory->CreateShape( c ) ); // 위임한다.
               //switch( c )
               //{
               //case 'R':
               //      shapes.push_back( new Rect );
               //      break;
               //case 'C':
               //      shapes.push_back( new Circle );
               //      break;
               //}
        }
};