派生类中的工厂方法

时间:2013-07-01 08:31:16

标签: c++ polymorphism factory-pattern dynamic-cast

我有两种消息:MessageAMessageB,它们都是从包含纯虚方法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 )
         ...
     } 
}

1 个答案:

答案 0 :(得分:0)

您可以使从IMessage派生的所有类在程序启动时静态地注册MessageFactory类(或更确切地说是特定工厂)。这可以通过使用一些静态实例来实现。然后IMessage接口需要一个纯虚方法canConstructFrom(string&),这样当一个字符串进来时,你将它传递给MessageFactory,工厂将找出哪个派生类可以从该字符串构造并实例化正确的字符串。