文章目录
- 前言
- 代码仓库
- 简单工厂模式(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博客
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获