工厂方法模式定义:
定义了一个创建对象的接口, 但由子类决定实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
///PizzaStore.h
#ifndef DEF_PIZZA_STORE_H_
#define DEF_PIZZA_STORE_H_
#include "Pizza.h"
/*
工厂方法模式定义:
定义了一个创建对象的接口, 但由子类决定实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
1,CPizzaStore为一个抽象的工厂类. 定义了一个创建对象的接口CreatePizza
2, 子类决定实例化的类是哪一个的意思是, CNYStylePizzaStore和CChicagoStylePizzaStore决定创建的pizza的类型
3, 工厂方法让类把实例化推迟到子类。意思是。本来在CPizzaStore根据Enum_PizzaType aoPizzaType决定创建pizza类型
现在通过在CNYStylePizzaStore和CChicagoStylePizzaStore的CreatePizza实现
*/
class CPizzaStore
{
public:
CPizzaStore();
void OrderPizza(Enum_PizzaType aoPizzaType);
virtual CPizza* CreatePizza(Enum_PizzaType aoPizzaType) = 0;
};
//纽约风味的pizza商店
class CNYStylePizzaStore : public CPizzaStore
{
public:
virtual CPizza* CreatePizza(Enum_PizzaType aoPizzaType);
};
//芝加哥风味的pizza商店
class CChicagoStylePizzaStore : public CPizzaStore
{
public:
virtual CPizza* CreatePizza(Enum_PizzaType aoPizzaType);
};
#endif
///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 CNYStyleCheesePizza : public CPizza
{
public:
//准备
virtual void Prepare();
//烘烤
virtual void Bake();
//切
virtual void Cut();
//包装
virtual void Box();
};
//素比萨
class CNYStyleVeggiePizza : public CPizza
{
public:
//准备
virtual void Prepare();
//烘烤
virtual void Bake();
//切
virtual void Cut();
//包装
virtual void Box();
};
//蛤比萨
class CNYStyleClamPizza : public CPizza
{
public:
//准备
virtual void Prepare();
//烘烤
virtual void Bake();
//切
virtual void Cut();
//包装
virtual void Box();
};
//奶酪比萨
class CChicagoStyleCheesePizza : public CPizza
{
public:
//准备
virtual void Prepare();
//烘烤
virtual void Bake();
//切
virtual void Cut();
//包装
virtual void Box();
};
//素比萨
class CChicagoStyleVeggiePizza : public CPizza
{
public:
//准备
virtual void Prepare();
//烘烤
virtual void Bake();
//切
virtual void Cut();
//包装
virtual void Box();
};
//蛤比萨
class CChicagoStyleClamPizza : public CPizza
{
public:
//准备
virtual void Prepare();
//烘烤
virtual void Bake();
//切
virtual void Cut();
//包装
virtual void Box();
};
#endif
/PizzaStore.cpp
#include "stdafx.h"
#include "PizzaStore.h"
#include <assert.h>
CPizzaStore::CPizzaStore()
{
}
void CPizzaStore::OrderPizza(Enum_PizzaType aoPizzaType)
{
CPizza *lpPizza = NULL;
lpPizza = CreatePizza(aoPizzaType);
assert(lpPizza);
if (NULL == lpPizza)
{
return;
}
lpPizza->Prepare();
lpPizza->Box();
lpPizza->Cut();
lpPizza->Box();
delete lpPizza;
lpPizza = NULL;
}
//纽约风味的pizza商店
CPizza* CNYStylePizzaStore::CreatePizza(Enum_PizzaType aoPizzaType)
{
CPizza* lpRetPizza = NULL;
switch(aoPizzaType)
{
case kCheesePizza:
{
lpRetPizza = new CNYStyleCheesePizza ;
break;
}
case kVeggiePizza:
{
lpRetPizza = new CNYStyleVeggiePizza;
break;
}
case kCalmPizza:
{
lpRetPizza = new CNYStyleClamPizza;
break;
}
}
return lpRetPizza;
}
//芝加哥风味的pizza商店
CPizza* CChicagoStylePizzaStore::CreatePizza(Enum_PizzaType aoPizzaType)
{
CPizza* lpRetPizza = NULL;
switch(aoPizzaType)
{
case kCheesePizza:
{
lpRetPizza = new CChicagoStyleCheesePizza ;
break;
}
case kVeggiePizza:
{
lpRetPizza = new CChicagoStyleVeggiePizza;
break;
}
case kCalmPizza:
{
lpRetPizza = new CChicagoStyleClamPizza;
break;
}
}
return lpRetPizza;
}
///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 CNYStyleCheesePizza::Bake()
{
std::cout<<"CNYStyleCheesePizza::Bake"<<std::endl;
}
void CNYStyleCheesePizza::Box()
{
std::cout<<"CNYStyleCheesePizza::Box"<<std::endl;
}
void CNYStyleCheesePizza::Cut()
{
std::cout<<"CNYStyleCheesePizza::Cut"<<std::endl;
}
void CNYStyleCheesePizza::Prepare()
{
std::cout<<"CNYStyleCheesePizza::Prepare"<<std::endl;
}
void CNYStyleVeggiePizza::Bake()
{
std::cout<<"CNYStyleVeggiePizza::Bake"<<std::endl;
}
void CNYStyleVeggiePizza::Box()
{
std::cout<<"CNYStyleVeggiePizza::Box"<<std::endl;
}
void CNYStyleVeggiePizza::Cut()
{
std::cout<<"CNYStyleVeggiePizza::Cut"<<std::endl;
}
void CNYStyleVeggiePizza::Prepare()
{
std::cout<<"CNYStyleVeggiePizza::Prepare"<<std::endl;
}
///
void CNYStyleClamPizza::Bake()
{
std::cout<<"CNYStyleClamPizza::Bake"<<std::endl;
}
void CNYStyleClamPizza::Box()
{
std::cout<<"CNYStyleClamPizza::Box"<<std::endl;
}
void CNYStyleClamPizza::Cut()
{
std::cout<<"CNYStyleClamPizza::Cut"<<std::endl;
}
void CNYStyleClamPizza::Prepare()
{
std::cout<<"CNYStyleClamPizza::Prepare"<<std::endl;
}
/
void CChicagoStyleCheesePizza::Bake()
{
std::cout<<"CChicagoStyleCheesePizza::Bake"<<std::endl;
}
void CChicagoStyleCheesePizza::Box()
{
std::cout<<"CChicagoStyleCheesePizza::Box"<<std::endl;
}
void CChicagoStyleCheesePizza::Cut()
{
std::cout<<"CChicagoStyleCheesePizza::Cut"<<std::endl;
}
void CChicagoStyleCheesePizza::Prepare()
{
std::cout<<"CChicagoStyleCheesePizza::Prepare"<<std::endl;
}
void CChicagoStyleVeggiePizza::Bake()
{
std::cout<<"CChicagoStyleVeggiePizza::Bake"<<std::endl;
}
void CChicagoStyleVeggiePizza::Box()
{
std::cout<<"CChicagoStyleVeggiePizza::Box"<<std::endl;
}
void CChicagoStyleVeggiePizza::Cut()
{
std::cout<<"CChicagoStyleVeggiePizza::Cut"<<std::endl;
}
void CChicagoStyleVeggiePizza::Prepare()
{
std::cout<<"CChicagoStyleVeggiePizza::Prepare"<<std::endl;
}
///
void CChicagoStyleClamPizza::Bake()
{
std::cout<<"CChicagoStyleClamPizza::Bake"<<std::endl;
}
void CChicagoStyleClamPizza::Box()
{
std::cout<<"CChicagoStyleClamPizza::Box"<<std::endl;
}
void CChicagoStyleClamPizza::Cut()
{
std::cout<<"CChicagoStyleClamPizza::Cut"<<std::endl;
}
void CChicagoStyleClamPizza::Prepare()
{
std::cout<<"CChicagoStyleClamPizza::Prepare"<<std::endl;
}
/main.cpp
#include "stdafx.h"
#include <iostream>
#include "PizzaStore.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CPizzaStore* lpPizzaStore = NULL;
lpPizzaStore = new CNYStylePizzaStore;
for (int liIndex = kCheesePizza; liIndex <= kCalmPizza; liIndex++)
{
lpPizzaStore->OrderPizza((Enum_PizzaType)liIndex);
}
delete lpPizzaStore ;
lpPizzaStore = NULL;
lpPizzaStore = new CChicagoStylePizzaStore;
for (int liIndex = kCheesePizza; liIndex <= kCalmPizza; liIndex++)
{
lpPizzaStore->OrderPizza((Enum_PizzaType)liIndex);
}
delete lpPizzaStore ;
lpPizzaStore = NULL;
return 0;
}