《Head First设计模式》-工厂模式C++实现

来源:互联网 发布:编程电极怎么编 编辑:程序博客网 时间:2024/05/20 20:58

问题需求:

一个披萨店有多种披萨(奶油,蛤蜊等),同一种披萨在不同的分店(纽约、芝加哥等)有不同的做法。为了将披萨店类和披萨类型解耦(增加可扩展性,比如增加新 的 披萨类型,或开分店等),将实例化披萨的方法进行封装,该方法可以成为工厂,以此来处理对象的创建,然后客户程序(披萨店抽象类)就可以根据披萨类型进行制作披萨。

工厂模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程进行封装的目的。工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

产品类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;}

运行结果



1 0
原创粉丝点击