失败的抽象工厂建设的最佳实践

man*_*ter 2 c++ c++11

背景

假设我们有一个抽象工厂的实现,调用如下:

std::string ObjectName = "An Object Name";
std::string Args = "Argument passed directly to constructor by the factory";

std::unique_ptr<MyBaseClass> MyPtr(ObjectFactory::Instance().Construct(ObjectName,Args));
Run Code Online (Sandbox Code Playgroud)

工厂使用std::map"An Object Name"成一个构造函数,它本身需要一个std::string作为参数.这个想法是用户比我更了解构造的对象,所以我应该放弃并让用户将他们想要的任何信息传递给构造函数.

Args恰好是预期的形式,但我不知道处理duff输入的最惯用的方式.如果用户提供无效的参数字符串会发生什么?

我能想到以下几点:

  • 让对象的构造函数抛出异常
  • require对象提供了一个bool Validate(std::string x)方法,该方法检查是否x是有效的参数字符串
  • 让工厂使用默认构造函数,然后调用初始化方法(问题:如果init方法失败怎么办?)
  • 设置bool成员变量,如果为true,则表示"此对象不处于理智状态"
  • 我没有想过的其他一些选择

Bli*_*ndy 6

抛出一个例外.您正在构建一个对象(虽然方式不同于此new),但失败是一个异常,如果可能发生则需要处理.

"解决方案2"与处理此问题无关,更多的是如何确定错误的输入.为此,它可以是一个可接受的解决方案,但它再次与手头的问题无关.

解决方案3在物体出现故障时使物体处于不确定状态,这是不可接受的.

解决方案4是另一种方法,如果您没有使用您的语言提供异常支持,这是唯一的方法,但我们这样做.在我看来,这种情况下的例外情况严格更好,因为未能构造一个对象是一个非常具有破坏性的行为,它应该需要替代代码或程序来消亡.