工厂模式
定义: 工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类
披萨商店实例
pizza.h
//// Created by Administrator on 2022/1/5.//#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 //CLION_PIZZA_H
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 << "make done" << std:: endl;std::cout << "Ming ordered" << 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;}
抽象工厂
定义: 抽象工厂提供一个用于创建相关或依赖对象的家族,而不需要明确指定具体的类。
抽象工厂利用对象组合:对象的创建被实现再工厂接口所暴露出来的方法中。
工厂方法使用继承: 把对象的创建委托给子类,子类实现工厂方法来创建对象。
