simple factory(简单工厂)

来源:互联网 发布:在淘宝抢手机怎么最快 编辑:程序博客网 时间:2024/05/22 07:55

简单工厂,不是一种模式

head first design pattern第四章  简单工厂的 C++实现。

 

 

//////////////////////////////////////////////////////// Pizza.h

 

#ifndef DEF_PIZZA_H_
#define DEF_PIZZA_H_

typedef enum
{
 kCheesePizza,
 kVeggiePizza,
 kCalmPizza
} Enum_PizzaType;

//比萨
class CPizza
{
public:
 //准备
 virtual void Prepare();
 //烘烤
 virtual void Bake();
 //切
 virtual void Cut();
 //包装
 virtual void Box();
};
//奶酪比萨
class CCheesePizza : public CPizza
{
public:
 //准备
 virtual void Prepare();
 //烘烤
 virtual void Bake();
 //切
 virtual void Cut();
 //包装
 virtual void Box();
};
//素比萨
class CVeggiePizza : public CPizza
{
public:
 //准备
 virtual void Prepare();
 //烘烤
 virtual void Bake();
 //切
 virtual void Cut();
 //包装
 virtual void Box();
};

//蛤比萨
class CClamPizza : public CPizza
{
public:
 //准备
 virtual void Prepare();
 //烘烤
 virtual void Bake();
 //切
 virtual void Cut();
 //包装
 virtual void Box();
};
#endif

 

///////////////////////////////////////////////////////////////pizza.cpp

 

#include "stdafx.h"
#include "Pizza.h"
#include <iostream>

void CPizza::Bake()
{
 std::cout<<"CPizza::Bake"<<std::endl;
}

void CPizza::Box()
{
 std::cout<<"CPizza::Box"<<std::endl;

}

void CPizza::Cut()
{
 std::cout<<"CPizza::Cut"<<std::endl;

}

void CPizza::Prepare()
{
 std::cout<<"CPizza::Prepare"<<std::endl;

}


void CCheesePizza::Bake()
{
 std::cout<<"CCheesePizza::Bake"<<std::endl;
}

void CCheesePizza::Box()
{
 std::cout<<"CCheesePizza::Box"<<std::endl;

}

void CCheesePizza::Cut()
{
 std::cout<<"CCheesePizza::Cut"<<std::endl;

}

void CCheesePizza::Prepare()
{
 std::cout<<"CCheesePizza::Prepare"<<std::endl;

}

void CVeggiePizza::Bake()
{
 std::cout<<"CVeggiePizza::Bake"<<std::endl;
}

void CVeggiePizza::Box()
{
 std::cout<<"CVeggiePizza::Box"<<std::endl;

}

void CVeggiePizza::Cut()
{
 std::cout<<"CVeggiePizza::Cut"<<std::endl;

}

void CVeggiePizza::Prepare()
{
 std::cout<<"CVeggiePizza::Prepare"<<std::endl;

}


void CClamPizza::Bake()
{
 std::cout<<"CClamPizza::Bake"<<std::endl;
}

void CClamPizza::Box()
{
 std::cout<<"CClamPizza::Box"<<std::endl;

}

void CClamPizza::Cut()
{
 std::cout<<"CClamPizza::Cut"<<std::endl;

}

void CClamPizza::Prepare()
{
 std::cout<<"CClamPizza::Prepare"<<std::endl;

}

 

////////////////////////////////////////////////////////////SimplePizzaFactory.h

#ifndef DEF_SIMPLE_PIZZA_FACTORY_H_
#define DEF_SIMPLE_PIZZA_FACTORY_H_

#include "Pizza.h"

class CSimplePizzaFactory
{
public:
 CPizza* CreatePizza(Enum_PizzaType aoPizzaType);
};

#endif

 

//////////////////////////////////////////////////////////////////SimplePizzaFactory.cpp

#include "stdafx.h"
#include "SimplePizzaFactory.h"

CPizza* CSimplePizzaFactory::CreatePizza(Enum_PizzaType aoPizzaType)
{
 switch(aoPizzaType)
 {

 case kCheesePizza:
  {
   return new CCheesePizza;
   break;
  }
 case kVeggiePizza:
  {
   return new CVeggiePizza;
   break;
  }
 case kCalmPizza:
  {
   return new CClamPizza;
   break;
  }
 }
 return NULL;
}

////////////////////////////////////////////////////////////////////PizzaStore.h

#ifndef  DEF_PIZZA_STORE_H_
#define  DEF_PIZZA_STORE_H_

#include "SimplePizzaFactory.h"

class CPizzaStore
{
public:
 CPizzaStore();
 void OrderPizza(Enum_PizzaType aoPizzaType);
protected:
 CSimplePizzaFactory m_oPizzaFactory;
};

#endif

///////////////////////////////////////////////////////////PizzaStore.cpp

#include "stdafx.h"
#include "PizzaStore.h"
#include <assert.h>

CPizzaStore::CPizzaStore()
{
 
}

void CPizzaStore::OrderPizza(Enum_PizzaType aoPizzaType)
{
  CPizza *lpPizza = NULL;
  lpPizza = m_oPizzaFactory.CreatePizza(aoPizzaType);
  assert(lpPizza);
  if (NULL == lpPizza)
  {
   return;
  }
  lpPizza->Prepare();
  lpPizza->Box();
  lpPizza->Cut();
  lpPizza->Box();
  
  delete lpPizza;
  lpPizza = NULL;
}

 

///////////////////////////////////////////////main.cpp


#include "stdafx.h"
#include <iostream>

#include "PizzaStore.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 CPizzaStore loPizzaStore;

 for (int liIndex = kCheesePizza; liIndex <= kCalmPizza; liIndex++)
 {
  loPizzaStore.OrderPizza((Enum_PizzaType)liIndex);
 }

 return 0;
}

 

 

 

原创粉丝点击