工厂方法模式(factory method)

工厂方法模式定义:

               定义了一个创建对象的接口, 但由子类决定实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

///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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值