简单工厂,不是一种模式
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;
}