在工厂中使用静态方法:优点和缺点?

Using static method in Factory: Pros and Cons?

本文关键字:缺点 静态方法 工厂      更新时间:2023-10-16

在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>().类工厂仅在反序列化内容或基于参数或某些配置构造不同类时才有用。