【问题标题】:Using static method in Factory: Pros and Cons? [closed]在工厂中使用静态方法:优点和缺点? [关闭]
【发布时间】:2018-01-14 19:24:35
【问题描述】:

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

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

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

我希望能列出可以帮助我和社区选择使用哪个优缺点的列表。

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

【问题讨论】:

  • 视情况而定。我的观点:如果你关心性能,你应该尽量减少成员函数的使用。有一个名为“释放你的函数”的 CppCon 演讲,你可能想看那个。

标签: c++ factory


【解决方案1】:

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

当工厂方法是非静态的时候有意义的一个例子是数据库连接对象的工厂,你实例化工厂,为你想要的数据库连接设置任何属性,然后调用 CreateConnection() 来获取具有指定属性的连接对象。这可能优于使用不同参数选项重载 CreateConnection 方法,因为属性在一个数据库连接之间可能会有很大差异。

将方法设为静态的一个示例是返回刚刚描述的实际工厂实例的方法。该工厂类型是简单创建的,不涉及任何调整。

【讨论】:

  • 但是在工厂只是创建对象的情况下,您说没有理由实例化工厂,但如果我们这样做,结果将是一样的,为什么不呢?
【解决方案2】:

同意前面的回答。结合更多的东西。

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

另一个,如果你的类工厂唯一要做的就是调用new Foo();,那么你根本不需要类工厂。 FooFactory::Create(); 不长于 std::make_unique<Foo>()。类工厂仅在您反序列化内容时有用,或者当您基于参数或某些配置构造不同的类时。

【讨论】:

  • 你说得对,这个例子对工厂无效,因为它根本不需要。我这样做是有意将问题集中在静态与否,而不是导致更多示例的内容。
  • 工厂(连同发布方法_可以保护您免受跨库分配问题。有时您真的不想在代码所在的位置“新”一些东西
  • @SornelHaetir 好点,但 IMO C++ ABI 太脆弱,无法跨动态库使用。除了 malloc 之外,还有异常、CRT 版本、条件符号等问题……人们通常使用更可靠的 ABI,例如 C API 或 Windows 上的 COM。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2013-05-31
  • 2011-10-23
  • 2014-01-03
  • 1970-01-01
相关资源
最近更新 更多