问题需求:
一个披萨店有多种披萨(奶油,蛤蜊等),同一种披萨在不同的分店(纽约、芝加哥等)有不同的做法。为了将披萨店类和披萨类型解耦(增加可扩展性,比如增加新 的 披萨类型,或开分店等),将实例化披萨的方法进行封装,该方法可以成为工厂,以此来处理对象的创建,然后客户程序(披萨店抽象类)就可以根据披萨类型进行制作披萨。
工厂模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程进行封装的目的。工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
产品类pizza.h
#ifndef PIZZA_H_
#define PIZZA_H_
#include<iostream>
#include<string>
#include<vector>
enum PizzaType{ cheese = 0, pepperoni, clam, veggie };//Pizaa类型
class Pizza{
public:
Pizza(){
}
virtual ~Pizza(){
}
void prepare(){
std::cout << "准备 " << name << std::endl;
std::cout << "和面团... " << std::endl;
std::cout << "添加酱汁... " << std::endl;
std::cout << "添加配料: " <<std::endl;
for (unsigned int i = 0; i < toppings.size(); ++i)
{
std::cout <<toppings[i];
}
std::cout << std::endl;
}
void bake(){//烘烤
std::cout << "在350度的条件下烘烤25分钟" << std::endl;
}
void cut(){//切片
std::cout << "把披萨切成斜片" << std:: endl;
}
void box(){//包装
std::cout << "把披萨放入正规披萨店的包装盒" << std::endl;
}
std::string getName(){
return name;
}
void setName(std::string temp_name){
name = temp_name;
}
void setdough(std::string temp_dough){
dough = temp_dough;
}
void setSauce(std::string temp_sauce){
sauce = temp_sauce;
}
void setToppings(std::vector<std::string> temp_topp){
toppings.assign( temp_topp.begin(),temp_topp.end());
}
private:
std::string name;//名称
std::string dough;//面团类型
std::string sauce;//酱料类型
std::vector<std::string> toppings;//一套作料
};
class NYStyleCheesePizza :public Pizza{
public:
NYStyleCheesePizza(){
setName("纽约风味酱汁奶油披萨");
setdough("薄的硬壳面团");
setSauce("番茄酱");
std::vector<std::string > temp_topp;
temp_topp.push_back("磨碎的");
temp_topp.push_back("Reddiano");
temp_topp.push_back("奶油");
setToppings(temp_topp);
}
};
class ChicagoStyleCheesePizza :public Pizza{
public:
ChicagoStyleCheesePizza(){
setName("芝加哥风味的深盘披萨");
setdough("非常薄的硬壳面团");
setSauce("梅子番茄酱");
std::vector<std::string > temp_topp;
temp_topp.push_back("切碎的");
temp_topp.push_back("Mozzarella");
temp_topp.push_back("奶油");
setToppings(temp_topp);
}
void cut(){
std::cout << "把披萨切成方形" << std::endl;//覆盖基类cut函数
}
};
#endif
工厂抽象类(提供接口)和子类(实现接口并实例化对象)PizzaStore.h
#ifndef PIZZASTORE_H_
#define PIZZASTORE_H_
#include"pizza.h"
class PizzaStore{
public:
Pizza* orderPizza(PizzaType type){
Pizza* temp_pizza;
temp_pizza = createPizza(type);
temp_pizza->prepare();
temp_pizza->bake();
temp_pizza->cut();
temp_pizza->box();
return temp_pizza;
}
virtual Pizza* createPizza(PizzaType type) = 0;
};
class NYPizzaStore :public PizzaStore{
public:
Pizza* createPizza(PizzaType type){
Pizza *pizza = new Pizza;;
switch (type)
{
case cheese:
pizza = new NYStyleCheesePizza();
break;
/*case cheese:
pizza = new NYStyleCheesePizza();
break;
case cheese:
pizza = new NYStyleCheesePizza();
break;*/
default:
std::cout << "There is not this type of pizze" << std::endl;
}
return pizza;
}
};
class ChicagoPizzaStore :public PizzaStore{
public:
Pizza* createPizza(PizzaType type){
Pizza *pizza = new Pizza;
switch (type)
{
case cheese:
pizza = new ChicagoStyleCheesePizza();
break;
/*case cheese:
pizza = new NYStyleCheesePizza();
break;
case cheese:
pizza = new NYStyleCheesePizza();
break;*/
default:
std::cout << "There is not this type of pizze" << std::endl;
}
return pizza;
}
};
#endif
主函数main.cpp
#include<iostream>
#include"pizza.h"
#include"PizzaStore.h"
int main()
{
PizzaStore* nyStore = new NYPizzaStore();
PizzaStore* ChicagoStore = new ChicagoPizzaStore();
Pizza* pizza = nyStore->orderPizza(cheese);//小明的订单
std::cout << "制作完毕" << std:: endl;
std::cout << "这是小明点的" << pizza->getName() << std::endl;
std::cout << std::endl;
std::cout << "----------------------------------------" << std::endl;
std::cout << std::endl;
pizza = ChicagoStore->orderPizza(cheese);//小红的订单
std::cout << "制作完毕" << std::endl;
std::cout << "这是小红点的" << pizza->getName() << std::endl;
}
运行结果