factory function (팩토리 함수)

반응형

새로 생성된 파생 클래스 객체에 대한 기본 클래스 포인터를 반환하는 함수.


class TimeKeeper
{
public:
 TimeKeeper(void);
 virtual ~TimeKeeper(void);
};

// 시간 계산이 어떻게 되는지 몰라도 시간 기록을 유지하기 위한 클래스들.
class AtomicClock : public TimeKeeper
{
public:
 AtomicClock(void)
 {
  cout<<"Atom"<<"\n";
 }
 ~AtomicClock(void){};
};

class WaterClock : public TimeKeeper
{
public:
 WaterClock(void)
 {
  cout<<"Water"<<"\n";
 }
 ~WaterClock(void){};
};

class WristWatch : public TimeKeeper
{
public:
 WristWatch(void)
 {
  cout<<"Wrist"<<"\n";
 }
 ~WristWatch(void){};
};

// 시계 생성 기본 클래스
class ClockMaker
{
public:
 // 새로 생성된 파생 클래스 객체에 대한 기본 클래스 포인터를 반환하는 함수.
 TimeKeeper* GetClock(string& name)
 {
  TimeKeeper* timeKeeper = MakeClock(name);
  // 이런저런일을 하자꾸나.
  return timeKeeper;
 }

protected:
 virtual TimeKeeper* MakeClock(string& name)=0;
};

class TimeClockMaker : public ClockMaker
{
public:
 // name에 따라 원하는 파생형으로 만들어서 반환.
 TimeKeeper* MakeClock(string& name)
 {
  TimeKeeper* timeKeeper = NULL;
  if(string("Atomic") == name)
  {
   timeKeeper = new AtomicClock;
  }
  else if(string("Water") == name)
  {
   timeKeeper = new WaterClock;
  }
  else if(string("Wrist") == name)
  {
   timeKeeper = new WristWatch;
  }
  return timeKeeper;
 }
};

int _tmain(int argc, _TCHAR* argv[])
{
 TimeKeeper* waterClock = NULL;
 TimeClockMaker* maker = new TimeClockMaker;

 string clockName = "Water";
 waterClock = maker->GetClock(clockName);
 return 0;
}

'Study > C++' 카테고리의 다른 글

int와 float 연산  (0) 2016.09.29
random  (0) 2014.11.29
Hash 함수 모음  (0) 2011.04.22
boost::has_trivial_assign  (0) 2011.04.10
메모리맵 파일  (0) 2011.04.09
TAGS.

Comments