《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
- 《Head First设计模式》-工厂模式C++实现
- 《Head First 设计模式》-抽象工厂模式C++实现
- Head First设计模式-简单工厂模式
- Head First设计模式-工厂模式
- Head First设计模式-抽象工厂模式
- 《Head First 设计模式》工厂模式
- Head First设计模式-简单工厂模式
- Head First设计模式-抽象工厂模式
- 《Head First 设计模式》之工厂模式
- Head First 设计模式 --工厂模式
- Head First设计模式之工厂模式
- Head First-设计模式:工厂模式
- 《Head First 设计模式》之简单工厂
- Head First---工厂模式
- Head First 工厂模式
- <Head First 设计模式>:工厂模式1:方法模式--Pizza
- Head First 设计模式学习笔记(4)---工厂模式
- Head First Java 设计模式——工厂方法模式
- Android微信支付开发
- 3D射线拾取算法揭秘
- NDK编程的一个坑—Arm平台下的类型转换
- leetcode oj java 143. Reorder List
- 四个月的蜕变之单例模式创建线程池和使用
- 《Head First设计模式》-工厂模式C++实现
- python 2-5 如何快速找到多个字典中的(key) viewkeys(集合)/reduce(lambda a,b:a&b,map(d.keys(),[d1,d2])
- zoj2314
- mysql5.7 修改默认密码
- POJ-1562(DFS)
- linux 用户和组管理
- 派生类和继承——(二)
- Indivisibility——Codeforce
- windows和linux下使用python2.7 urllib.urlopen+beautifulsoup打开12306网站订票页面表现不同,前者报错ssl认证失败,后者成功