工厂模式 C++工厂模式的模板,包含简单工厂、工厂方法和抽象工厂三种常见的实现方式。
1. 简单工厂模式模板 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 #include <iostream> #include <memory> #include <string> class Product {public : virtual ~Product () = default ; virtual void operation () = 0 ; }; class ConcreteProductA : public Product {public : void operation () override { std::cout << "ConcreteProductA operation" << std::endl; } }; class ConcreteProductB : public Product {public : void operation () override { std::cout << "ConcreteProductB operation" << std::endl; } }; class SimpleFactory {public : enum class ProductType { TYPE_A, TYPE_B }; static std::unique_ptr<Product> createProduct (ProductType type) { switch (type) { case ProductType::TYPE_A: return std::make_unique <ConcreteProductA>(); case ProductType::TYPE_B: return std::make_unique <ConcreteProductB>(); default : return nullptr ; } } }; int main_simple_factory () { auto productA = SimpleFactory::createProduct (SimpleFactory::ProductType::TYPE_A); auto productB = SimpleFactory::createProduct (SimpleFactory::ProductType::TYPE_B); if (productA) productA->operation (); if (productB) productB->operation (); return 0 ; }
2. 工厂方法模式模板 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 #include <iostream> #include <memory> #include <string> class Product {public : virtual ~Product () = default ; virtual void operation () = 0 ; }; class ConcreteProductA : public Product {public : void operation () override { std::cout << "ConcreteProductA operation" << std::endl; } }; class ConcreteProductB : public Product {public : void operation () override { std::cout << "ConcreteProductB operation" << std::endl; } }; class Factory {public : virtual ~Factory () = default ; virtual std::unique_ptr<Product> createProduct () = 0 ; }; class ConcreteFactoryA : public Factory {public : std::unique_ptr<Product> createProduct () override { return std::make_unique <ConcreteProductA>(); } }; class ConcreteFactoryB : public Factory {public : std::unique_ptr<Product> createProduct () override { return std::make_unique <ConcreteProductB>(); } }; int main_factory_method () { std::unique_ptr<Factory> factoryA = std::make_unique <ConcreteFactoryA>(); std::unique_ptr<Factory> factoryB = std::make_unique <ConcreteFactoryB>(); auto productA = factoryA->createProduct (); auto productB = factoryB->createProduct (); productA->operation (); productB->operation (); return 0 ; }
3. 抽象工厂模式模板 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 #include <iostream> #include <memory> #include <string> class AbstractProductA {public : virtual ~AbstractProductA () = default ; virtual void operationA () = 0 ; }; class AbstractProductB {public : virtual ~AbstractProductB () = default ; virtual void operationB () = 0 ; }; class ConcreteProductA1 : public AbstractProductA {public : void operationA () override { std::cout << "ConcreteProductA1 operation" << std::endl; } }; class ConcreteProductA2 : public AbstractProductA {public : void operationA () override { std::cout << "ConcreteProductA2 operation" << std::endl; } }; class ConcreteProductB1 : public AbstractProductB {public : void operationB () override { std::cout << "ConcreteProductB1 operation" << std::endl; } }; class ConcreteProductB2 : public AbstractProductB {public : void operationB () override { std::cout << "ConcreteProductB2 operation" << std::endl; } }; class AbstractFactory {public : virtual ~AbstractFactory () = default ; virtual std::unique_ptr<AbstractProductA> createProductA () = 0 ; virtual std::unique_ptr<AbstractProductB> createProductB () = 0 ; }; class ConcreteFactory1 : public AbstractFactory {public : std::unique_ptr<AbstractProductA> createProductA () override { return std::make_unique <ConcreteProductA1>(); } std::unique_ptr<AbstractProductB> createProductB () override { return std::make_unique <ConcreteProductB1>(); } }; class ConcreteFactory2 : public AbstractFactory {public : std::unique_ptr<AbstractProductA> createProductA () override { return std::make_unique <ConcreteProductA2>(); } std::unique_ptr<AbstractProductB> createProductB () override { return std::make_unique <ConcreteProductB2>(); } }; int main_abstract_factory () { std::unique_ptr<AbstractFactory> factory1 = std::make_unique <ConcreteFactory1>(); std::unique_ptr<AbstractFactory> factory2 = std::make_unique <ConcreteFactory2>(); auto productA1 = factory1->createProductA (); auto productB1 = factory1->createProductB (); auto productA2 = factory2->createProductA (); auto productB2 = factory2->createProductB (); productA1->operationA (); productB1->operationB (); productA2->operationA (); productB2->operationB (); return 0 ; }
4. 模板工厂模式(使用模板) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #include <iostream> #include <memory> class BaseProduct {public : virtual ~BaseProduct () = default ; virtual void operation () = 0 ; }; class ProductA : public BaseProduct {public : void operation () override { std::cout << "ProductA operation" << std::endl; } }; class ProductB : public BaseProduct {public : void operation () override { std::cout << "ProductB operation" << std::endl; } }; template <typename T>class TemplateFactory {public : static std::unique_ptr<T> create () { return std::make_unique <T>(); } }; int main_template_factory () { auto productA = TemplateFactory<ProductA>::create (); auto productB = TemplateFactory<ProductB>::create (); productA->operation (); productB->operation (); return 0 ; }
各种工厂模式的特点
简单工厂模式 :
优点:客户端不需要知道具体类的实现细节,只需传入参数即可
缺点:违背开闭原则,新增产品需要修改工厂类
工厂方法模式 :
优点:符合开闭原则,新增产品只需新增对应的工厂类
缺点:类的数量增加,系统更复杂
抽象工厂模式 :
优点:保证产品族的一致性,易于交换产品系列
缺点:不易扩展产品等级结构
模板工厂模式 :
优点:代码简洁,类型安全
缺点:编译时确定类型,灵活性较低