我有一个复杂的类,我想强制用户使用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; }
};
然后是用户:
int main(int argc, char** argv)
{
auto w = WidgetFactory::create();
w->printMessage();
}
另一种方法是使用私有令牌使ctor显式公开,这样我就可以使用std :: make_shared / unique。
但我不记得之前看过这种模式,所以我的问题是,这是一个好习惯吗?你介意从你的同事那里看到这样的代码吗?
提前感谢。
答案 0 :(得分:5)
不,这不是一个好习惯:
std::unique_ptr
一切都让人想起“当你有一把新锤子时,一切看起来像钉子”。它有很好的用途,但它并没有解决所有问题auto
的代码看起来不错,但您无法使用它来创建成员变量工厂模式很好(我个人喜欢它),但我不认为每个对象都需要使用它来创建。