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

问题需求:

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

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

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

运行结果



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值