我有两种消息:MessageA
和MessageB
,它们都是从包含纯虚方法IMessage
的抽象类std::string toString()
派生的。所以我可以将每个消息转换为其字符串表示形式,并指向基类。没关系。但是,我需要以某种方式从字符串构造消息(具体类型的消息),例如:
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 )
...
}
}
答案 0 :(得分:0)
您可以使从IMessage
派生的所有类在程序启动时静态地注册MessageFactory
类(或更确切地说是特定工厂)。这可以通过使用一些静态实例来实现。然后IMessage
接口需要一个纯虚方法canConstructFrom(string&)
,这样当一个字符串进来时,你将它传递给MessageFactory
,工厂将找出哪个派生类可以从该字符串构造并实例化正确的字符串。