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

时间:2018-01-14 19:24:35

标签: c++ factory

在C ++中,当您有一个对象的Factory类时,创建该对象的方法可以用作以下之一:

非静态方法

声明:

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();

例如,使用静态方法可以避免实例化工厂。

这是一个好的做法还是有任何其他好的论据支持或反对这两种解决方案?

我很欣赏一系列利弊,可以帮助我和社区选择使用哪些。

人们应该避免使用意见,因为我正在寻找基于专家经验的反馈。

2 个答案:

答案 0 :(得分:1)

选择其中一个的主要原因是是否有其他信息会改变实例化。如果工厂类具有这样的信息(并且信息可以变化而不是简单地设置)那么工厂方法是非静态的是有意义的。如果工厂只是创建对象(或返回函数本地静态实例的地址),则没有理由要求实例化工厂类型。

将工厂方法设置为非静态的一个示例是数据库连接对象的工厂,您实例化工厂,设置所需的数据库连接的任何属性,然后调用CreateConnection()来获取具有指定属性的连接对象。这可能比使用不同的参数选项重载CreateConnection方法更好,因为从一个数据库连接到另一个数据库连接的属性可能会有很大差异。

将方法设置为静态的示例将是返回刚刚描述的实际工厂的实例的方法。简单地创建了工厂类型,没有涉及调整。

答案 1 :(得分:0)

同意之前的回答。结合更多的事情。

std::unique_ptr通常比原始指针更好。

另一个,如果你的班级工厂唯一做的就是调用new Foo();你根本不需要一个班级工厂。 FooFactory::Create();不会超过std::make_unique<Foo>()。类工厂只在你反序列化东西时,或者你根据参数或某些配置构建不同的类时才有用。