Head First设计模式C++实现-Factory模式

定义:

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

作用:

将创建对象的代码集中在一个对象或方法中,可以避免代码中的重复,并且更方便以后的维护。这也意为着客户在实例化对象时,只会依赖于接口,而不是具体类。这遵循了实现针对接口编程,而不针对实现编程的原则。可以让代码更具有弹性,可以应对未来的扩展。

UML结构图如下:

Head First设计模式C++实现-Factory模式

实现代码:

/************************************************************************/ /* Pizza.h */ /************************************************************************/ /** * @file Pizza.h * @brief Factory模式的实现代码 * @author [email protected] * http://blog.****.net/rabbit729 * @version 1.0 * @date 2009-02-13 */ #ifndef PIZZA_H_ #define PIZZA_H_ #include <string> #include <vector> #include <iostream> using namespace std; class Pizza { public: Pizza(); ~Pizza(); public: void Prepare(); virtual void Bake(); virtual void Cut(); virtual void Box(); string GetName(); protected: string name; string dough; string sauce; vector<string> toppings; }; class NYStyleCheesePizza : public Pizza { public: NYStyleCheesePizza(); ~NYStyleCheesePizza(); }; class ChicagoStyleCheesePizza : public Pizza { public: ChicagoStyleCheesePizza(); ~ChicagoStyleCheesePizza(); public: void Cut(); }; #endif /************************************************************************/ /* PizzaStore.h */ /************************************************************************/ /** * @file PizzaStore.h * @brief Factory模式的实现代码 * @author [email protected] * http://blog.****.net/rabbit729 * @version 1.0 * @date 2009-02-13 */ #ifndef PIZZASTORE_H_ #define PIZZASTORE_H_ #include "Pizza.h" class PizzaStore { public: PizzaStore(); ~PizzaStore(); public: Pizza* OrderPizza(string type); protected: virtual Pizza* CreatePizza(string type) = 0; }; class NYPizzaStore : public PizzaStore { public: Pizza* CreatePizza(string type); }; class ChicagoPizzaStore : public PizzaStore { public: Pizza* CreatePizza(string type); }; #endif /************************************************************************/ /* Pizza.cpp */ /************************************************************************/ #include "Pizza.h" Pizza::Pizza() { } Pizza::~Pizza() { } void Pizza::Prepare() { string sb; sb.append("Preparing " + name + "/n"); sb.append("Tossing " + dough + "/n"); sb.append("Adding " + sauce + "/n"); sb.append("Adding toppings: /n"); vector<string>::iterator it; for (it = toppings.begin(); it != toppings.end(); it++) { sb.append("/t" + *it + "/n"); } cout<<sb<<endl; } void Pizza::Bake() { cout<<"Bake for 25 minutes at 350"<<endl; } void Pizza::Cut() { cout<<"Cutting the pizza into diagonal slices"<<endl; } void Pizza::Box() { cout<<"Place pizza in official PizzaStore box"<<endl; } string Pizza::GetName() { return name; } NYStyleCheesePizza::NYStyleCheesePizza() { name = "NY Style Sauce and Cheese Pizza"; dough = "Thin Crust Dough"; sauce = "Martinara Sauce"; toppings.push_back("Greated Reggiano Cheese"); } NYStyleCheesePizza::~NYStyleCheesePizza() { } ChicagoStyleCheesePizza::ChicagoStyleCheesePizza() { name = "Chicago Style Deep Dish Cheese Pizza"; dough = "Extra Thick Crust Dough"; sauce = "Plum Tomato Sauce"; toppings.push_back("Shredded Mozzarella Cheese"); } ChicagoStyleCheesePizza::~ChicagoStyleCheesePizza() { } void ChicagoStyleCheesePizza::Cut() { cout<<"Cutting the pizza into square slices"<<endl; } /************************************************************************/ /* PizzaStore.cpp */ /************************************************************************/ #include "PizzaStore.h" PizzaStore::PizzaStore() { } PizzaStore::~PizzaStore() { } Pizza* PizzaStore::OrderPizza(string type) { Pizza* pizza; pizza = CreatePizza(type); pizza->Prepare(); pizza->Bake(); pizza->Cut(); pizza->Box(); return pizza; } Pizza* NYPizzaStore::CreatePizza(string type) { if(!type.compare("cheese")) { return new NYStyleCheesePizza(); } else { return NULL; } } Pizza* ChicagoPizzaStore::CreatePizza(string type) { if(!type.compare("cheese")) { return new ChicagoStyleCheesePizza(); } else { return NULL; } } /************************************************************************/ /* test.cpp */ /************************************************************************/ #include "PizzaStore.h" void main(void) { PizzaStore* nyStore = new NYPizzaStore(); PizzaStore* chicagoStore = new ChicagoPizzaStore(); Pizza* pizza = nyStore->OrderPizza("cheese"); cout<<"Ethan ordered a " + pizza->GetName()<<endl; cout<<endl; pizza = chicagoStore->OrderPizza("cheese"); cout<<"Joel ordered a " + pizza->GetName()<<endl; }

程序输出:

Preparing NY Style Sauce and Cheese Pizza
Tossing Thin Crust Dough
Adding Martinara Sauce
Adding toppings:
Greated Reggiano Cheese

Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a NY Style Sauce and Cheese Pizza

Preparing Chicago Style Deep Dish Cheese Pizza
Tossing Extra Thick Crust Dough
Adding Plum Tomato Sauce
Adding toppings:
Shredded Mozzarella Cheese

Bake for 25 minutes at 350
Cutting the pizza into square slices
Place pizza in official PizzaStore box
Joel ordered a Chicago Style Deep Dish Cheese Pizza
请按任意键继续. . .