在工厂中使用静态方法:优点和缺点?
Using static method in Factory: Pros and Cons?
在C++中,当您具有对象的工厂类时,创建对象的方法可以用作以下方法之一:
非静态方法:
声明:
class FooFactory{
public:
Foo* Create() {
return new Foo();
}
};
用法
FooFactory fooFactory;
Foo* foo = fooFactory.Create();
静态方法:
声明:
class FooFactory{
public:
static Foo* Create() {
return new Foo();
}
};
用法
Foo* foo = FooFactory::Create();
例如,使用静态方法可以避免实例化工厂。
这是一种好的做法,还是有任何其他支持或反对这两种解决方案的良好论据?
我希望能列出可以帮助我和社区选择使用哪个的利弊列表。
人们应该避免使用意见,因为我正在寻找基于专家经验的反馈。
选择一个而不是另一个的主要原因是是否有其他信息会更改实例化。如果工厂类具有此类信息(并且该信息可以变化而不是简单地设置),那么工厂方法是非静态的。如果工厂只是创建对象(或返回函数本地静态实例的地址),则没有理由要求实例化工厂类型。
工厂方法非静态的一个示例是数据库连接对象的工厂,您实例化工厂,为所需的数据库连接设置任何属性,然后调用 CreateConnection() 以获取具有指定属性的连接对象。这可能优于使用不同的参数选项重载 CreateConnection 方法,因为属性从一个 databse 连接到另一个 databse 连接可能会有很大差异。
将方法设置为静态的一个示例是返回刚才描述的实际工厂的实例的方法。该工厂类型只是简单地创建,不涉及调整。
同意前面的答案。还有几件事。
std::unique_ptr
通常比原始指针更好。
另一个,如果你的类工厂唯一做的就是调用new Foo();
你根本不需要类工厂。FooFactory::Create();
不超过std::make_unique<Foo>()
.类工厂仅在反序列化内容或基于参数或某些配置构造不同类时才有用。
相关文章:
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 如何通过命名空间调用非静态方法
- 如何在没有实例的情况下获取非静态方法的类型?
- 调用从模板派生的类的静态方法,而不指定模板
- 如何在 c++ 中异步调用静态方法?
- C++ 将静态方法转换为简单方法
- 从另一个标头中的标头调用静态方法
- C++中静态方法的局部变量范围
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 当只有静态方法受到影响时,如何解决C++中的链接器错误?
- 静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 从部分专用模板方法调用模板非静态方法
- 如何使用 c++ 在 cocos2dx 中定义非静态方法
- 使用 CMake 的静态方法链接错误
- 在子类上调用模板化静态方法时获取类的类型名
- 仅具有公共静态方法的帮助程序类
- 在工厂中使用静态方法:优点和缺点?
- OOP——使用静态方法有缺点吗