当前位置:首页 > 编程笔记 > 正文
已解决

简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板

来自网友在路上 11218121提问 提问时间:2023-11-21 11:41:11阅读次数: 121

最佳答案 问答题库1218位专家为你答疑解惑

文章目录

  • 前言
  • 代码仓库
  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)
  • 总结
  • 参考资料
  • 作者的话

前言

简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板。


代码仓库

  • yezhening/Programming-examples: 编程实例 (github.com)
  • Programming-examples: 编程实例 (gitee.com)

简单工厂模式(Simple Factory)

结构

  • 抽象产品类
  • 具体产品类 A
  • 具体产品类 B
  • 简单工厂类
  • 简单工厂类的静态方法创建具体产品对象 A 和具体产品对象 B

核心

  • 继承
  • 多态
  • 一个工厂创建多类产品

代码

#include <iostream>
#include <string>
#include <memory>using std::cerr;
using std::cout;
using std::endl;
using std::make_unique;
using std::string;
using std::unique_ptr;// 抽象产品类
class AbstractProduct
{
public:AbstractProduct() = default;virtual ~AbstractProduct() = default;virtual void func() = 0;
};// 具体产品类 A
class ConcreteProductA : public AbstractProduct
{
public:ConcreteProductA() = default;~ConcreteProductA() override = default;void func() override{cout << "ConcreteProductA" << endl;}
};// 具体产品类 B
class ConcreteProductB : public AbstractProduct
{
public:ConcreteProductB() = default;~ConcreteProductB() override = default;void func() override{cout << "ConcreteProductB" << endl;}
};// 简单工厂类
class SimpleFactory
{
public:// 静态方法依据类型创建不同的具体产品static unique_ptr<AbstractProduct> create_concrete_product(const string &concrete_product_type){if (concrete_product_type == "A"){return make_unique<ConcreteProductA>();}else if (concrete_product_type == "B"){return make_unique<ConcreteProductB>();}else{cerr << "Unknown type of concrete product" << endl;return nullptr;}}
};// 客户端
int main()
{// 使用简单工厂创建不同类型的具体产品unique_ptr<AbstractProduct> concrete_product_a = SimpleFactory::create_concrete_product("A"); // 创建具体产品对象 Aif (concrete_product_a != nullptr){concrete_product_a->func();}unique_ptr<AbstractProduct> concrete_product_b = SimpleFactory::create_concrete_product("B"); // 创建具体产品对象 Bif (concrete_product_b != nullptr){concrete_product_b->func();}unique_ptr<AbstractProduct> concrete_product_c = SimpleFactory::create_concrete_product("C"); // 创建具体产品对象 Cif (concrete_product_c != nullptr){concrete_product_c->func();}return 0;
}
/*
输出:
ConcreteProductA
ConcreteProductB
Unknown type of concrete product
*/

工厂方法模式(Factory Method)

结构

  • 抽象产品类
  • 具体产品类 A
  • 具体产品类 B
  • 抽象工厂类
  • 具体工厂类 A
  • 具体工厂类 B
  • 具体工厂对象 A 的方法创建具体产品对象 A
  • 具体工厂对象 B 的方法创建具体产品对象 B

核心

  • 继承
  • 多态
  • 一类工厂创建一类产品

代码

#include <iostream>
#include <memory>using std::cout;
using std::endl;
using std::make_unique;
using std::unique_ptr;// 抽象产品类
class AbstractProduct
{
public:AbstractProduct() = default;virtual ~AbstractProduct() = default;virtual void func() = 0;
};// 具体产品类 A
class ConcreteProductA : public AbstractProduct
{
public:ConcreteProductA() = default;~ConcreteProductA() override = default;void func() override{cout << "ConcreteProductA" << endl;}
};// 具体产品类 B
class ConcreteProductB : public AbstractProduct
{
public:ConcreteProductB() = default;~ConcreteProductB() override = default;void func() override{cout << "ConcreteProductB" << endl;}
};// 抽象工厂类
class AbstractFactory
{
public:AbstractFactory() = default;virtual ~AbstractFactory() = default;virtual unique_ptr<AbstractProduct> create_concrete_product() const = 0;
};// 具体工厂类 A
class ConcreteFactoryA : public AbstractFactory
{
public:ConcreteFactoryA() = default;~ConcreteFactoryA() override = default;inline unique_ptr<AbstractProduct> create_concrete_product() const override{return make_unique<ConcreteProductA>();}
};// 具体工厂类 B
class ConcreteFactoryB : public AbstractFactory
{
public:ConcreteFactoryB() = default;~ConcreteFactoryB() override = default;inline unique_ptr<AbstractProduct> create_concrete_product() const override{return make_unique<ConcreteProductB>();}
};// 客户端
int main()
{// 使用工厂方法创建不同类型的具体产品unique_ptr<AbstractFactory> concrete_factory_a = make_unique<ConcreteFactoryA>();               // 创建具体工厂对象 Aunique_ptr<AbstractProduct> concrete_product_a = concrete_factory_a->create_concrete_product(); // 创建具体产品对象 Aconcrete_product_a->func();unique_ptr<AbstractFactory> concrete_factory_b = make_unique<ConcreteFactoryB>();               // 创建具体工厂对象 Bunique_ptr<AbstractProduct> concrete_product_b = concrete_factory_b->create_concrete_product(); // 创建具体产品对象 Bconcrete_product_b->func();return 0;
}
/*
输出:
ConcreteProductA
ConcreteProductB
*/

抽象工厂模式(Abstract Factory)

结构

  • 抽象产品类 A
  • 具体产品类 A1
  • 具体产品类 B1
  • 抽象产品类 B
  • 具体产品类 B1
  • 具体产品类 B2
  • 抽象工厂类1
  • 具体工厂类1
  • 抽象工厂类2
  • 具体工厂类2
  • 具体工厂对象1 的方法创建具体产品对象 A1 和 具体产品对象 B1
  • 具体工厂对象2 的方法创建具体产品对象 A2 和 具体产品对象 B2

核心

  • 继承
  • 多态
  • 产品和工厂形成二维结构:工厂1创建产品 A1 和 B1,工厂2创建产品 A2 和 B2

代码

#include <iostream>
#include <memory>using std::cout;
using std::endl;
using std::make_unique;
using std::unique_ptr;// 抽象产品类 A
class AbstractProductA
{
public:AbstractProductA() = default;virtual ~AbstractProductA() = default;virtual void func() = 0;
};// 具体产品类 A1
class ConcreteProductA1 : public AbstractProductA
{
public:ConcreteProductA1() = default;~ConcreteProductA1() override = default;void func() override{cout << "ConcreteProductA1" << endl;}
};// 具体产品类 A2
class ConcreteProductA2 : public AbstractProductA
{
public:ConcreteProductA2() = default;~ConcreteProductA2() override = default;void func() override{cout << "ConcreteProductA2" << endl;}
};// 抽象产品类 B
class AbstractProductB
{
public:AbstractProductB() = default;virtual ~AbstractProductB() = default;virtual void func() = 0;
};// 具体产品类 B1
class ConcreteProductB1 : public AbstractProductB
{
public:ConcreteProductB1() = default;~ConcreteProductB1() override = default;void func() override{cout << "ConcreteProductB1" << endl;}
};// 具体产品类 B2
class ConcreteProductB2 : public AbstractProductB
{
public:ConcreteProductB2() = default;~ConcreteProductB2() override = default;void func() override{cout << "ConcreteProductB2" << endl;}
};// 抽象工厂类
class AbstractFactory
{
public:AbstractFactory() = default;virtual ~AbstractFactory() = default;virtual unique_ptr<AbstractProductA> create_product_a() const = 0;virtual unique_ptr<AbstractProductB> create_product_b() const = 0;
};// 具体工厂类 1
class ConcreteFactory1 : public AbstractFactory
{
public:ConcreteFactory1() = default;virtual ~ConcreteFactory1() = default;inline unique_ptr<AbstractProductA> create_product_a() const override{return make_unique<ConcreteProductA1>();}inline unique_ptr<AbstractProductB> create_product_b() const override{return make_unique<ConcreteProductB1>();}
};// 具体工厂类 2
class ConcreteFactory2 : public AbstractFactory
{
public:ConcreteFactory2() = default;virtual ~ConcreteFactory2() = default;inline unique_ptr<AbstractProductA> create_product_a() const override{return make_unique<ConcreteProductA2>();}inline unique_ptr<AbstractProductB> create_product_b() const override{return make_unique<ConcreteProductB2>();}
};// 客户端
int main()
{// 使用抽象工厂创建不同类型的具体产品unique_ptr<AbstractFactory> concrete_factory_1 = make_unique<ConcreteFactory1>();          // 创建具体工厂对象1unique_ptr<AbstractProductA> concrete_product_a1 = concrete_factory_1->create_product_a(); // 创建具体产品对象 A1unique_ptr<AbstractProductB> concrete_product_b1 = concrete_factory_1->create_product_b(); // 创建具体产品对象 B1concrete_product_a1->func();concrete_product_b1->func();unique_ptr<AbstractFactory> concrete_factory_2 = make_unique<ConcreteFactory2>();          // 创建具体工厂2unique_ptr<AbstractProductA> concrete_product_a2 = concrete_factory_2->create_product_a(); // 创建具体产品对象 B1unique_ptr<AbstractProductB> concrete_product_b2 = concrete_factory_2->create_product_b(); // 创建具体产品对象 B1concrete_product_a2->func();concrete_product_b2->func();return 0;
}
/*
输出:
ConcreteProductA1
ConcreteProductB1
ConcreteProductA2
ConcreteProductB2
*/

总结

简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板。


参考资料

  • 【精选】创建型设计模式总结_夜悊的博客-CSDN博客

作者的话

  • 感谢参考资料的作者/博主
  • 作者:夜悊
  • 版权所有,转载请注明出处,谢谢~
  • 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板":http://eshow365.cn/6-41201-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!