Head First 设计模式——chapter4 工厂模式C++实现

工厂模式:

用来封装对象的创建。

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。决定是指编写创建者类时,不需要知道实际创建的产品是哪个,选择了使用哪个子类,自然就决定了实际创建的产品是什么。如pizzastore不需要知道实际产品,而使用具体NYPizzaStore类,就会自然决定实际创建NYPizza()。

#pragma
#include <iostream>
#include <string>
#include <vector>
class Pizza {
public:

	virtual void prepare();
	virtual void bake();
	virtual void cut();
	virtual void box();
	std::string getname() { return name; }
public:
	std::string name;
	std::string dough;
	std::string sauce;
	std::vector<std::string> toppings;
};

class PizzaStore {
protected:
	virtual Pizza* creatPizza(std::string type)=0;
public:
	Pizza* orderPizza(std::string type);

};


class NYPizza :public Pizza {
public:
	NYPizza();
};

class ChicagoPizza :public Pizza {
public:
	ChicagoPizza();
	void cut() override;
};

class NYPizzaStore :public PizzaStore {
protected:
	Pizza* creatPizza(std::string type)override;
};

class ChicagoPizzaStore :public PizzaStore {
protected:
	Pizza* creatPizza(std::string type)override;
};
#include "test.h"

void Pizza::prepare()
{
	std::cout << "preparing " << name << "\n";
	std::cout << "Tossing dough...\n";
	std::cout << "Adding sauce...\n";
	std::cout << "Adding toppings:\n";
	for (int i = 0; i < toppings.size(); i++)
		std::cout << " " << toppings[i] << "\n";
}
void Pizza::bake()
{
	printf("Bake for 25 minutes at 350\n");
}

void Pizza::cut()
{
	printf("Cutting the pizza into diagonal slices\n");
}

void Pizza::box()
{
	printf("Place pizza in official PizzaStore box\n");
}


Pizza* PizzaStore::orderPizza(std::string type)
{
	Pizza* pizza = creatPizza(type);

	pizza->prepare();
	pizza->cut();
	pizza->box();
	return pizza;
}

NYPizza:: NYPizza() :Pizza()
{
	name = "NY Style Sauce and  Cheese Pizza";
	dough = "Thin Crust Dough";
	sauce = "Marrinara sauce";
	toppings.push_back("Grated Reggiano Cheese");
}

ChicagoPizza::ChicagoPizza() :Pizza()
{
	name = "Chicago Style Sauce and  Cheese Pizza";
	dough = "Extra Thick Curst Dough";
	sauce = "Plum Tomato Sauce";
	toppings.push_back("Shredded Mozzarella Cheese");
}

void ChicagoPizza::cut()
{
	printf("Cutting the pizza into square slices\n");
}

Pizza* NYPizzaStore::creatPizza(std::string type)
{
	if (type == "cheese")
		return new NYPizza();
	else return nullptr;
}

Pizza* ChicagoPizzaStore::creatPizza(std::string type)
{
	if (type == "cheese")
		return new ChicagoPizza();
	else return nullptr;
}
int main()
{
	PizzaStore* nyppstore = new NYPizzaStore();
	PizzaStore* Chstore = new ChicagoPizzaStore();

	nyppstore->orderPizza("cheese");
	printf("****************************\n");
	Chstore->orderPizza("cheese");

	system("pause");
	return 0;
}

分为创建者类和产品类两个抽象类。分别有自己的具体子类。

工厂类中提供orderPizza接口,每个工厂实例的orderPizza中调用creatPizza生产具体的产品对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值