派生类中的工厂方法
Factory methods in derived classes
我有两种消息:MessageA
和MessageB
,它们都派生自包含纯虚拟方法std::string toString()
的抽象类IMessage
。因此,我可以通过指向基类的指针将每条消息转换为其字符串表示。没关系。然而,我需要以某种方式从字符串中构造消息(具体类型的消息),例如:MessageA* msg = [something].fromString( str )
。如果给定的字符串不适合构造MessageA
,我希望得到NULL。我可以看到两种方法来完成这项任务:
a) MessageFactory
与dynamic_cast
class MessageFactory
{
IMessage* fromString( const std::string& str );
};
...
MessageFactory mf;
MessageA* msg = dynamic_cast< MessageA* >( mf.fromString( str ) );
if ( msg ) { ... }
然而,这使用了dynamic_cast,我希望避免使用它。
b) 每个派生类中的工厂方法
static MessageA* fromString( const std::string& str )
{
return stringIsOk( str ) ? new MessageA() : NULL;
}
有更好的解决方案吗?我应该改变一下总体设计吗?非常感谢。
更新
有时我知道我应该从字符串中得到什么样的消息,即
void sendRequest()
{
...
std::string response;
MessageA* msg = fromString( response );
// here i should only check if string is valid for MessageA
}
但有时我不知道会发生什么:
void processMessage( const std::string& str )
{
IMessage* msg = fromString( str );
if ( msg )
{
MessageA* msgA = dynamic_cast< MessageA* >( msg );
if ( msgA )
...
}
}
您可以使从IMessage
派生的所有类在程序启动时静态地向MessageFactory
类注册它们自己(或者更确切地说是一个特定的工厂)。这可以通过使用一些静态实例来实现。然后,IMessage
接口需要有一个纯虚拟方法canConstructFrom(string&)
,这样当一个字符串出现时,您可以将其传递给MessageFactory
,工厂将发现哪些派生类可以从该字符串中构造,并实例化正确的派生类。
相关文章:
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 工厂方法:分配和strcpy_s的差异
- 在基类中编写工厂方法
- 从工厂方法返回的ComPtr的引用计数增加两次
- 工厂方法模式使用继承而抽象工厂模式使用组合如何
- 在C++中将返回unique_ptr和shared_ptr的两个工厂方法组合为一个
- 工厂方法中的访问冲突
- 如何模板静态工厂方法?
- 工厂方法创建的对象应该在哪里删除?
- 如何禁用在工厂方法之外创建/复制 obj?
- 为 STL 随机数生成器编写工厂方法
- 此工厂方法是否会导致争用条件?
- 如何从JSON String创建工厂方法
- C++可扩展的工厂方法
- 总结工厂方法
- 对不同的参数使用工厂方法模式
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- Boost::log 使用静态工厂方法
- 如何使用工厂方法创建不同的对象
- 我可以有一个仅使用工厂方法创建的成员变量吗?