创建型设计模式之工厂模式

简单工厂:通过一个工厂类集中管理对象的创建逻辑,将对象的创建与使用解耦,特点->静态创建方法

工厂方法:将对象的创建逻辑延迟到子类中实现。通过定义抽象工厂接口和具体工厂子类,每个工厂子类负责创建特定的产品对象,实现解耦对象创建与使用

抽象工厂:创建一组相关或依赖的对象(产品族),而无需指定其具体类。它通过定义 抽象工厂接口具体工厂实现,确保产品族内对象的 兼容性一致性

  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 }

 

posted @ 2025-05-21 16:44  璀丶璨星灬空  阅读(5)  评论(0)    收藏  举报