在工厂中使用静态方法:优点和缺点?
Using static method in Factory: Pros and Cons?
在 C++ 中,当您有一个对象的工厂 class 时,创建该对象的方法可以用作以下方法之一:
非静态方法:
声明:
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();
例如,使用静态方法可以避免实例化工厂。
这是一个好的做法还是有任何其他好的论据支持或反对这两种解决方案?
我希望能列出可以帮助我和社区选择使用哪个的优缺点。
人们应该避免使用意见,因为我正在寻找基于专家经验的反馈。
选择一个而不是另一个的主要原因是是否有额外的信息会改变实例化。如果工厂 class 有这样的信息(并且这些信息可以变化而不是简单地设置)那么工厂方法是非静态的就有意义了。如果工厂将简单地创建对象(或 return 函数本地静态实例的地址),则没有理由要求实例化工厂类型。
工厂方法何时有意义的一个示例是数据库连接对象的工厂,您实例化该工厂,为您想要的数据库连接设置任何属性,然后调用 CreateConnection()获取具有指定属性的连接对象。这可能优于使用不同的参数选项重载 CreateConnection 方法,因为属性可能因一个数据库连接而异。
静态方法有意义的一个例子是 return 是刚刚描述的实际工厂实例的方法。该工厂类型是简单创建的,不涉及调优。
同意前面的回答。再加点东西。
std::unique_ptr
通常比原始指针更好。
另一个,如果你的 class 工厂唯一做的就是调用 new Foo();
你根本不需要 class 工厂。 FooFactory::Create();
不长于 std::make_unique<Foo>()
。 Class 工厂仅在反序列化内容或基于参数或某些配置构建不同的 classes 时有用。
在 C++ 中,当您有一个对象的工厂 class 时,创建该对象的方法可以用作以下方法之一:
非静态方法:
声明:
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();
例如,使用静态方法可以避免实例化工厂。
这是一个好的做法还是有任何其他好的论据支持或反对这两种解决方案?
我希望能列出可以帮助我和社区选择使用哪个的优缺点。
人们应该避免使用意见,因为我正在寻找基于专家经验的反馈。
选择一个而不是另一个的主要原因是是否有额外的信息会改变实例化。如果工厂 class 有这样的信息(并且这些信息可以变化而不是简单地设置)那么工厂方法是非静态的就有意义了。如果工厂将简单地创建对象(或 return 函数本地静态实例的地址),则没有理由要求实例化工厂类型。
工厂方法何时有意义的一个示例是数据库连接对象的工厂,您实例化该工厂,为您想要的数据库连接设置任何属性,然后调用 CreateConnection()获取具有指定属性的连接对象。这可能优于使用不同的参数选项重载 CreateConnection 方法,因为属性可能因一个数据库连接而异。
静态方法有意义的一个例子是 return 是刚刚描述的实际工厂实例的方法。该工厂类型是简单创建的,不涉及调优。
同意前面的回答。再加点东西。
std::unique_ptr
通常比原始指针更好。
另一个,如果你的 class 工厂唯一做的就是调用 new Foo();
你根本不需要 class 工厂。 FooFactory::Create();
不长于 std::make_unique<Foo>()
。 Class 工厂仅在反序列化内容或基于参数或某些配置构建不同的 classes 时有用。