使用工厂朋友班分配新班级,好习惯?

sap*_*sap 2 c++ factory friend

我有一个复杂的类,我想强制用户使用std :: unique_ptr,我认为最好的方法是创建一个返回std :: unique_ptr并隐藏ctor的工厂方法.

问题是,我添加的工厂方法越多,标题和代码开始看起来越脏.

所以我想也许如果我创建一个新的ClassFactory类,其中包含所有工厂方法,它看起来更干净,每次我想添加一个新的工厂方法我只是编辑工厂类并完成它(保留原始班级干净).

例如:

class Widget
{
private:
    friend class WidgetFactory;

    Widget(){}
    Widget(const Widget& other) = delete;
    Widget& operator = (const Widget& other) = delete;

    std::string _msg;

public:
    void printMessage(){ std::cout << _msg << std::endl; }
};

class WidgetFactory
{
public:
    static std::unique_ptr<Widget> create(){ auto w = std::unique_ptr<Widget>(new Widget);
                                             w->_msg = "hello world!"; return w; }
};
Run Code Online (Sandbox Code Playgroud)

然后是用户:

int main(int argc, char** argv)
{
    auto w = WidgetFactory::create();
    w->printMessage();
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用私有令牌使ctor显式公开,这样我就可以使用std :: make_shared/unique.

但我不记得之前看过这种模式,所以我的问题是,这是一个好习惯吗?你介意从你的同事那里看到这样的代码吗?

提前致谢.

BЈо*_*вић 5

不,这不是一个好习惯:

  1. 您将无法为单元测试创​​建此类对象 - 您必须使用工厂
  2. 使用std::unique_ptr的一切都让人想起"当你有一把新锤子时,一切看起来像钉子".它有很好的用途,但并不能解决所有问题
  3. 代码auto看起来不错,但你不能用它来创建成员变量
  4. 对于大型(或至少是中型)项目,使用一个工厂来做一切都会变得非常麻烦,并且会打败它的目的

工厂模式很好(我个人喜欢它),但我不认为每个对象都需要使用它来创建.

  • @sap你仍然可以使用std :: unique_ptr的工厂模式,只是不要隐藏构造函数.并且不要为所有对象使用一个工厂. (2认同)
  • @sap通常,工厂将用于运行时多态,例如创建具有公共接口的具体类.每个具体类都有一个`create()`函数,工厂类将存储这些创建者的函数指针的注册表.可以在运行时探测注册表,以查看必须将哪个特定的具体类分配给`std :: unique_ptr <Base>`.创建函数只返回一个`std :: make_unique <Derived>`.但是你希望构造函数是公共的,因为知道要生成哪个类的客户端应该能够在没有"unique_ptr"的情况下这样做. (2认同)