创建型设计模式之工厂模式
简单工厂:通过一个工厂类集中管理对象的创建逻辑,将对象的创建与使用解耦,特点->静态创建方法
工厂方法:将对象的创建逻辑延迟到子类中实现。通过定义抽象工厂接口和具体工厂子类,每个工厂子类负责创建特定的产品对象,实现解耦对象创建与使用
抽象工厂:创建一组相关或依赖的对象(产品族),而无需指定其具体类。它通过定义 抽象工厂接口 和 具体工厂实现,确保产品族内对象的 兼容性 和 一致性
1 #include <iostream> 2 #include <mutex> 3 #include <string> 4 using namespace std; 5 6 /*-----------------------------------------------------------简单工厂------------------------------------------------------------------*/ 7 class Product // 先将产品抽象出来 8 { 9 public: 10 virtual ~Product() {}; // 析构函数必须是虚函数,这样在析构的时候,才会把子类也析构了 11 virtual void operation() = 0; 12 }; 13 14 class ProductA : public Product // 具体产品A 15 { 16 public: 17 void operation() override 18 { 19 std::cout << "generate product a" << '\n'; 20 } 21 22 ProductA() 23 { 24 std::cout << "A" << '\n'; 25 } 26 27 ~ProductA() 28 { 29 std::cout << "~A" << '\n'; 30 } 31 }; 32 33 class ProductB : public Product // 具体产品B 34 { 35 public: 36 void operation() override 37 { 38 std::cout << "generate product b" << '\n'; 39 } 40 41 ProductB() 42 { 43 std::cout << "B" << '\n'; 44 } 45 46 ~ProductB() 47 { 48 std::cout << "~B" << '\n'; 49 } 50 }; 51 52 class SimpleFactory : public ProductA, public ProductB 53 { 54 public: 55 static Product *generate_product(string &product_type) // 利用参数控制工厂 56 { 57 if ("A" == product_type) 58 { 59 return new ProductA; 60 } 61 else if ("B" == product_type) 62 { 63 return new ProductB; 64 } 65 else 66 { 67 return nullptr; 68 } 69 } 70 }; 71 /*-----------------------------------------------------------工厂方法------------------------------------------------------------------*/ 72 class Document // 将产品抽象出来 73 { 74 public: 75 virtual ~Document() = default; // 析构函数必须是虚函数,这样在析构的时候,才会把子类也析构了 76 virtual void serialize() const = 0; 77 }; 78 79 class PdfDocument : public Document // 具体pdf产品 80 { 81 public: 82 void serialize() const override 83 { 84 cout << "PdfDocument serialize" << '\n'; 85 } 86 }; 87 88 class TxtDocument : public Document // 具体TXT产品 89 { 90 public: 91 void serialize() const override 92 { 93 cout << "TxtDocument serialize" << '\n'; 94 } 95 }; 96 97 class Factor // 将工厂抽象出来 98 { 99 public: 100 virtual ~Factor() = default; // 析构函数必须是虚函数,这样在析构的时候,才会把子类也析构了 101 virtual Document *CreateDocument() const = 0; 102 void work() 103 { 104 auto ptr = CreateDocument(); 105 ptr->serialize(); 106 } 107 }; 108 109 class PdfFactor : public Factor // 具体PDF工厂 110 { 111 Document *CreateDocument() const override 112 { 113 return new PdfDocument; 114 } 115 }; 116 117 class TxtFactor : public Factor // 具体TXT工厂 118 { 119 Document *CreateDocument() const override 120 { 121 return new TxtDocument; 122 } 123 }; 124 125 /*-----------------------------------------------------------抽象工厂------------------------------------------------------------------*/ 126 class Button // 抽象一个产品Button 127 { 128 public: 129 virtual ~Button() = default; // 析构函数必须是虚函数,这样在析构的时候,才会把子类也析构了 130 virtual void render() = 0; 131 }; 132 133 class TextBox // 抽象一个产品TextBox 134 { 135 public: 136 virtual ~TextBox() = default; 137 virtual void render() = 0; 138 }; 139 140 class WindowsButton : public Button // 具体产品WindowsButton 141 { 142 public: 143 void render() override 144 { 145 cout << "WindowsButton" << '\n'; 146 } 147 }; 148 149 class WindowsTextBox : public TextBox // 具体产品WindowsTextBox 150 { 151 public: 152 void render() override 153 { 154 cout << "WindowsTextBox" << '\n'; 155 } 156 }; 157 158 class GuiFactory // 抽象工厂 159 { 160 public: 161 virtual ~GuiFactory() = default; // 析构函数必须是虚函数,这样在析构的时候,才会把子类也析构了 162 virtual WindowsButton *CreateGuiButton() = 0; 163 virtual WindowsTextBox *CreateGuiTextBox() = 0; 164 }; 165 166 class WindowsFactory : public GuiFactory // 具体工厂 167 { 168 public: 169 WindowsButton *CreateGuiButton() 170 { 171 return new WindowsButton; 172 } 173 174 WindowsTextBox *CreateGuiTextBox() 175 { 176 return new WindowsTextBox; 177 } 178 }; 179 180 int main(int argc, char *argv[]) 181 { 182 /*简单工厂*/ 183 string type = "A"; 184 Product *pa = SimpleFactory::generate_product(type); 185 type = "B"; 186 Product *pb = SimpleFactory::generate_product(type); 187 188 /*工厂方法*/ 189 Factor *pdf = new PdfFactor; 190 pdf->work(); 191 192 Factor *txt = new TxtFactor; 193 txt->work(); 194 195 /*抽象工厂*/ 196 GuiFactory *pfactory = new WindowsFactory; 197 WindowsButton *wb = pfactory->CreateGuiButton(); 198 WindowsTextBox *wt = pfactory->CreateGuiTextBox(); 199 wb->render(); 200 wt->render(); 201 return 0; 202 }