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

文章目录

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

前言

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


代码仓库


简单工厂模式(Simple Factory)

结构

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

核心

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

代码

cpp 复制代码
#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"); // 创建具体产品对象 A
    if (concrete_product_a != nullptr)
    {
        concrete_product_a->func();
    }

    unique_ptr<AbstractProduct> concrete_product_b = SimpleFactory::create_concrete_product("B"); // 创建具体产品对象 B
    if (concrete_product_b != nullptr)
    {
        concrete_product_b->func();
    }

    unique_ptr<AbstractProduct> concrete_product_c = SimpleFactory::create_concrete_product("C"); // 创建具体产品对象 C
    if (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

核心

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

代码

cpp 复制代码
#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>();               // 创建具体工厂对象 A
    unique_ptr<AbstractProduct> concrete_product_a = concrete_factory_a->create_concrete_product(); // 创建具体产品对象 A
    concrete_product_a->func();

    unique_ptr<AbstractFactory> concrete_factory_b = make_unique<ConcreteFactoryB>();               // 创建具体工厂对象 B
    unique_ptr<AbstractProduct> concrete_product_b = concrete_factory_b->create_concrete_product(); // 创建具体产品对象 B
    concrete_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

代码

cpp 复制代码
#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>();          // 创建具体工厂对象1
    unique_ptr<AbstractProductA> concrete_product_a1 = concrete_factory_1->create_product_a(); // 创建具体产品对象 A1
    unique_ptr<AbstractProductB> concrete_product_b1 = concrete_factory_1->create_product_b(); // 创建具体产品对象 B1
    concrete_product_a1->func();
    concrete_product_b1->func();

    unique_ptr<AbstractFactory> concrete_factory_2 = make_unique<ConcreteFactory2>();          // 创建具体工厂2
    unique_ptr<AbstractProductA> concrete_product_a2 = concrete_factory_2->create_product_a(); // 创建具体产品对象 B1
    unique_ptr<AbstractProductB> concrete_product_b2 = concrete_factory_2->create_product_b(); // 创建具体产品对象 B1
    concrete_product_a2->func();
    concrete_product_b2->func();

    return 0;
}
/*
输出:
ConcreteProductA1
ConcreteProductB1
ConcreteProductA2
ConcreteProductB2
*/

总结

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


参考资料


作者的话

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

相关推荐
LXS_3575 小时前
Day 18 C++提高 之 STL常用容器(string、vector、deque)
开发语言·c++·笔记·学习方法·改行学it
deng-c-f6 小时前
Linux C/C++ 学习日记(53):原子操作(二):实现shared_ptr
开发语言·c++·学习
一个不知名程序员www6 小时前
算法学习入门---结构体和类(C++)
c++·算法
墨雪不会编程7 小时前
C++ string 详解:STL 字符串容器的使用技巧
java·开发语言·c++
yangpipi-7 小时前
《C++并发编程实战》第5章 C++内存模型和原子操作
android·java·c++
SunkingYang7 小时前
MFC进程间消息通信深度解析:SendMessage、PostMessage与SendNotifyMessage的底层实现与实战指南
c++·mfc·共享内存·通信·postmessage·sendmessage·进程间
XFF不秃头8 小时前
力扣刷题笔记-旋转图像
c++·笔记·算法·leetcode
王老师青少年编程9 小时前
csp信奥赛C++标准模板库STL案例应用3
c++·算法·stl·csp·信奥赛·lower_bound·标准模版库
Tim_1010 小时前
【C++入门】04、C++浮点型
开发语言·c++
hkNaruto10 小时前
【C++】记录一次C++程序编译缓慢原因分析——滥用stdafx.h公共头文件
开发语言·c++