工厂模式:
用来封装对象的创建。
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。决定是指编写创建者类时,不需要知道实际创建的产品是哪个,选择了使用哪个子类,自然就决定了实际创建的产品是什么。如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生产具体的产品对象。