使用工厂朋友类分配新类,好习惯
use factory friend class to allocate new class, good practice?
我有一个复杂的类,我想强制用户使用它使用 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。
但我不记得以前见过这种模式,所以我的问题是,这是好的做法吗?你介意从你的同事那里看到这样的代码吗?
提前谢谢。
不,这不是一个好的做法:
- 您将无法为单元测试创建此类对象 - 您必须使用工厂
- 使用
std::unique_ptr
表示一切让人想起"当你有一把新锤子时,一切看起来都像钉子"这句话。它有一个很好的用途,但它不能解决所有问题 - 带有
auto
的代码看起来不错,但不能使用它来创建成员变量 - 对于大型(或至少是中型)项目,使用一个工厂来处理所有事情将变得非常麻烦,并且会违背其目的。
工厂模式很好(我个人喜欢它),但我不认为实际上每个对象都需要使用它来创建。
相关文章:
- 将指针类分配给新类,C++
- 在解决链表问题时创建一个额外的节点是一个好习惯吗?
- 使用完数据结构后清空数据结构是一个好习惯吗?
- VS2015/VC++ 在新类模板中禁用默认 #include "stdafx.h"
- 实例化新类时未调用的方法
- C++用一个新类初始化二维向量;默认值更改
- 让二传手返回布尔值是好习惯吗?
- 来自抽象类的新类
- 在同一C 源文件中使用多个名称空间是一个好习惯吗?
- 在Visual Studio代码中为C 创建一个新类
- 我的二传手在新类中不起作用(继承)
- 是聪明的指针是RAII的好习惯
- 使用 move-constructor 时将 self 重置为 nullptr 是一个好习惯吗?
- 如何创建一个新类来继承 ostream 并将其用作 cout 但带有锁定
- (C++)我需要在新类的头文件中包含什么
- 将指针施放为成员函数作为C函数的指针是一个好习惯吗?
- 如何防止类被错误化,只允许新类?
- 关于包括新类的基本问题
- 重建operator()是重建的好习惯
- 使用工厂朋友类分配新类,好习惯