答案:C++通用工厂模式通过模板与注册机制解耦对象创建,使用std::function和静态映射表实现类型注册与动态创建,支持多态和扩展参数构造,适用于配置驱动或插件系统。

在C++中实现通用的工厂模式,核心目标是解耦对象的创建过程,让程序在运行时根据需求动态创建具体类型的对象。为了实现“通用”,我们可以借助模板、函数指针或std::function、以及注册机制,使工厂能够支持任意可构造类型。
1. 使用模板与注册机制的通用工厂
通过模板和类型注册,可以构建一个支持任意类注册与创建的工厂。常用方法是维护一个映射表(如map),将字符串或ID与创建函数绑定。
示例代码:
#include
说明:
- Factory模板参数Base是所有可创建类型的基类。
- register_type
用于注册派生类,传入名称绑定创建逻辑。 - create方法根据名称返回unique_ptr
,实现多态。 - 使用静态成员函数get_registry()保证注册表全局唯一且延迟初始化。
2. 使用方式示例
定义基类和派生类:
立即学习“C++免费学习笔记(深入)”;
struct Product {
virtual ~Product() = default;
virtual void do_something() = 0;
};
struct ConcreteProductA : Product {
void do_something() override {
// ...
}
};
struct ConcreteProductB : Product {
void do_something() override {
// ...
}
};
使用工厂注册并创建:
原本这个程序只是本人两年前初学时练手的,最近拿出来进行了修改,所以叫XmxCms 企业网站管理系统2.0 开发环境:WinXP + VS2008 + SQLServer 2008 + Access开发语言:C#本程序采用 三层架构 + 抽象工厂设计模式 + Linq 实现,目前只做了Access 和 SQL Server ,默认数据库为Access,要更换数据库只需修改web.config 即可
int main() {
Factory factory;
factory.register_type("A");
factory.register_type("B");
auto obj = factory.create("A");
if (obj) {
obj->do_something();
}
}
3. 支持带参数的构造
如果需要传递参数给构造函数,可以扩展Creator签名,或使用lambda封装参数。
例如:
// 注册时捕获参数
factory.register_type([](){
return std::make_unique(42, "test");
}, "A_with_args");
或者设计工厂接受参数包,但会增加复杂度,通常推荐用配置对象或构建器配合工厂使用。
4. 线程安全考虑
注册通常在程序启动阶段完成,若需多线程注册,应对get_registry()中的静态map加锁,或使用Meyers单例+C++11静态初始化线程安全特性(局部静态变量初始化是线程安全的)。
基本上就这些。这种实现方式灵活、可复用,适合插件系统、配置驱动对象创建等场景。










