diff --git a/Factory-Pattern/ChicagoPizzaStore.hpp b/Factory-Pattern/ChicagoPizzaStore.hpp new file mode 100644 index 0000000000000000000000000000000000000000..45e2f89240872df0879ec2f8ed1589e821bd753a --- /dev/null +++ b/Factory-Pattern/ChicagoPizzaStore.hpp @@ -0,0 +1,25 @@ +#ifndef CHICAGOPIZZASTORE_HPP +#define CHICAGOPIZZASTORE_HPP + +#include "PizzaStore.hpp" +#include "ChicagoStyleCheesePizza.hpp" +#include "ChicagoStylePepperoniPizza.hpp" + +class ChicagoPizzaStore : public PizzaStore { +public: + std::unique_ptr createPizza(std::string type) { + std::unique_ptr pizza = nullptr; + + if (type == "cheese") + { + pizza = std::make_unique(); + } + else if (type == "pepperoni") + { + pizza = std::make_unique(); + } + return pizza; + } +}; + +#endif \ No newline at end of file diff --git a/Factory-Pattern/ChicagoStyleCheesePizza.hpp b/Factory-Pattern/ChicagoStyleCheesePizza.hpp new file mode 100644 index 0000000000000000000000000000000000000000..7666b17720f7873e28536584dcc72901cde42215 --- /dev/null +++ b/Factory-Pattern/ChicagoStyleCheesePizza.hpp @@ -0,0 +1,18 @@ +#ifndef CHICAGOSTYLECHEESEPIZZA_HPP +#define CHICAGOSTYLECHEESEPIZZA_HPP + +#include "Pizza.hpp" + +class ChicagoStyleCheesePizza: public Pizza +{ +public: + ChicagoStyleCheesePizza() + { + name = "Chicago Style Deep Dish Pizza"; + dough = "Extra thick crust dough"; + sauce = "Plum tomato sauce"; + toppings.push_back("Shredded mozzarella"); + } +}; + +#endif \ No newline at end of file diff --git a/Factory-Pattern/ChicagoStylePepperoniPizza.hpp b/Factory-Pattern/ChicagoStylePepperoniPizza.hpp new file mode 100644 index 0000000000000000000000000000000000000000..eeafc7712774a49d52ede25c3c905d0c88c993dd --- /dev/null +++ b/Factory-Pattern/ChicagoStylePepperoniPizza.hpp @@ -0,0 +1,20 @@ +#ifndef CHICAGOSTYLEPEPPERONIPIZZA_HPP +#define CHICAGOSTYLEPEPPERONIPIZZA_HPP + +#include "Pizza.hpp" + +class ChicagoStylePepperoniPizza: public Pizza +{ +public: + ChicagoStylePepperoniPizza() + { + name = "Chicago Style Pepperoni Pizza"; + dough = "Extra thick crust dough"; + sauce = "Plum tomato sauce"; + toppings.push_back("Shredded mozzarella"); + toppings.push_back("Sliced pepperoni"); + toppings.push_back("No olives or eggplant because that should not go on a pizza"); + } +}; + +#endif \ No newline at end of file diff --git a/Factory-Pattern/Makefile b/Factory-Pattern/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..9ce53e4916c61b476d2d1c709ca95af247321ae7 --- /dev/null +++ b/Factory-Pattern/Makefile @@ -0,0 +1,5 @@ +all: + g++ -g -Wall main.cpp -o main + +clean: + rm main diff --git a/Factory-Pattern/NYPizzaStore.hpp b/Factory-Pattern/NYPizzaStore.hpp new file mode 100644 index 0000000000000000000000000000000000000000..02fb3d88876c0f5e6820affce2335ba818917ca3 --- /dev/null +++ b/Factory-Pattern/NYPizzaStore.hpp @@ -0,0 +1,25 @@ +#ifndef NYPIZZASTORE_HPP +#define NYPIZZASTORE_HPP + +#include "PizzaStore.hpp" +#include "NYStyleCheesePizza.hpp" +#include "NYStylePepperoniPizza.hpp" + +class NYPizzaStore : public PizzaStore { +public: + std::unique_ptr createPizza(std::string type) { + std::unique_ptr pizza = nullptr; + + if (type == "cheese") + { + pizza = std::make_unique(); + } + else if (type == "pepperoni") + { + pizza = std::make_unique(); + } + return pizza; + } +}; + +#endif \ No newline at end of file diff --git a/Factory-Pattern/NYStyleCheesePizza.hpp b/Factory-Pattern/NYStyleCheesePizza.hpp new file mode 100644 index 0000000000000000000000000000000000000000..3d2e05537baeb123aa608864d7e5bd30568301f6 --- /dev/null +++ b/Factory-Pattern/NYStyleCheesePizza.hpp @@ -0,0 +1,17 @@ +#ifndef NYSTYLECHEESEPIZZA_HPP +#define NYSTYLECHEESEPIZZA_HPP + +#include "Pizza.hpp" + +class NYStyleCheesePizza : public Pizza { +public: + NYStyleCheesePizza() + { + name = "NY Style sauce and cheese pizza"; + dough = "Thin crust dough"; + sauce = "Marinara sauce"; + toppings.push_back("Gratted reggiano cheese"); + } +}; + +#endif \ No newline at end of file diff --git a/Factory-Pattern/NYStylePepperoniPizza.hpp b/Factory-Pattern/NYStylePepperoniPizza.hpp new file mode 100644 index 0000000000000000000000000000000000000000..9041f22a2cec05cdaaaa5436c8dbea61bf605fc5 --- /dev/null +++ b/Factory-Pattern/NYStylePepperoniPizza.hpp @@ -0,0 +1,23 @@ +#ifndef NYSTYLEPEPPERONIPIZZA_HPP +#define NYSTYLEPEPPERONIPIZZA_HPP + +#include "Pizza.hpp" + +class NYStylePepperoniPizza: public Pizza +{ +public: + NYStylePepperoniPizza() + { + name = "NY style pepperoni pizza"; + dough = "Thin crust dough"; + sauce = "Marinara sauce"; + toppings.push_back("Grated reggiano cheese"); + toppings.push_back("Sliced pepperoni"); + toppings.push_back("Garlic"); + toppings.push_back("Onion"); + toppings.push_back("Mushrooms"); + toppings.push_back("Red pepper"); + } +}; + +#endif diff --git a/Factory-Pattern/Pizza.hpp b/Factory-Pattern/Pizza.hpp new file mode 100644 index 0000000000000000000000000000000000000000..7baf402f7e18dca13c229899da212912c3907370 --- /dev/null +++ b/Factory-Pattern/Pizza.hpp @@ -0,0 +1,73 @@ +#ifndef PIZZA_HPP +#define PIZZA_HPP + +#include +#include +#include +#include + +class Pizza { +public: + std::string name; + std::string dough; + std::string sauce; + std::vector toppings; + + const std::string& getName() const; + + virtual void prepare() const; + virtual void bake() const; + virtual void cut() const; + virtual void box() const; + virtual ~Pizza() = default; +}; + +const std::string& Pizza::getName() const +{ + return this->name; +} + +void Pizza::prepare() const +{ + std::cout << "Preparing " + getName() << std::endl; + std::cout << "Tossing dough..." << std::endl; + std::cout << "Adding sauce..." << std::endl; + std::cout << "Adding toppings: " << std::endl; + for (auto& topping : this->toppings) + { + std::cout << " " + topping + "\n"; + } +} +void Pizza::bake() const +{ + std::cout << "Baking for 25 min at 350 degrees "<< std::endl; +} + +void Pizza::cut() const +{ + std::cout << "Cut the pizza into diagonal slices "<< std::endl; +} +void Pizza::box() const +{ + std::cout << "Boxing in official PizzaStore boxes" << std::endl; +} + +std::ostream& operator<<(std::ostream& os, const Pizza& pizza) +{ + std::string str; + + str = "\n---- " + pizza.getName() + "----\n"; + str.append(pizza.dough + "\n"); + str.append(pizza.sauce + "\n"); + + for (auto& topping : pizza.toppings) + { + str.append(" " + topping + "\n"); + } + + str.append("\n"); + + return os << str; +} + +#endif \ No newline at end of file diff --git a/Factory-Pattern/PizzaStore.hpp b/Factory-Pattern/PizzaStore.hpp new file mode 100644 index 0000000000000000000000000000000000000000..2c02113d7ab53a28a2f73dcb879aa50b0ae90c25 --- /dev/null +++ b/Factory-Pattern/PizzaStore.hpp @@ -0,0 +1,25 @@ +#ifndef PIZZASTORE_HPP +#define PIZZASTORE_HPP + +#include "Pizza.hpp" + +#include + +class PizzaStore { +public: + std::unique_ptr orderPizza(std::string type) { + auto pizza = createPizza(type); + if(pizza != nullptr) + { + std::cout << "\n--- Making a " + pizza->getName() + " ---\n \n"; + pizza->prepare(); + pizza->bake(); + pizza->cut(); + pizza->box(); + } + return pizza; + } + virtual std::unique_ptr createPizza(std::string type) = 0; +}; + +#endif \ No newline at end of file diff --git a/Factory-Pattern/README.md b/Factory-Pattern/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e1e48bcc4e18713b50316c8c3b98e919910d637f --- /dev/null +++ b/Factory-Pattern/README.md @@ -0,0 +1,3 @@ +## 工厂模式 + +![](https://img-blog.csdnimg.cn/20190623171420456.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlc3Ricm9va2xpdQ==,size_16,color_FFFFFF,t_70) \ No newline at end of file diff --git a/Factory-Pattern/main.cpp b/Factory-Pattern/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c2f75e385640a5ab392d0a77438679f4bb01c12e --- /dev/null +++ b/Factory-Pattern/main.cpp @@ -0,0 +1,15 @@ +#include "NYPizzaStore.hpp" +#include "ChicagoPizzaStore.hpp" +#include "PizzaStore.hpp" +#include "Pizza.hpp" + +int main() +{ + auto nyStore = new NYPizzaStore(); + auto chicagoStore = new ChicagoPizzaStore(); + + auto nyCheese = nyStore->orderPizza("cheese"); + auto chicagoCheese = chicagoStore->orderPizza("cheese"); + + return 0; +} diff --git a/README.md b/README.md index 9a38695369068a6c96a10ddbc707eb7d553be8a7..51a153b23e1d93d05199a5ce2962c19aba3c57f9 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ + [Bridge](https://github.com/liu-jianhao/Cpp-Design-Patterns/tree/master/Bridge) ### 对象创建: + [Factory Method](https://github.com/liu-jianhao/Cpp-Design-Patterns/tree/master/Factory%20Method) ++ [Factory(Head-First版)](https://github.com/liu-jianhao/Cpp-Design-Patterns/tree/master/Factory-Pattern) ++ [Bridge](https://github.com/liu-jianhao/Cpp-Design-Patterns/tree/master/Bridge) + [Abstract Factory](https://github.com/liu-jianhao/Cpp-Design-Patterns/tree/master/Abstract%20Factory) + [Prototype](https://github.com/liu-jianhao/Cpp-Design-Patterns/tree/master/Prototype) + [Builder](https://github.com/liu-jianhao/Cpp-Design-Patterns/tree/master/Builder)