派生类中的工厂方法

Factory methods in derived classes

本文关键字:工厂 方法 派生      更新时间:2023-10-16

我有两种消息:MessageAMessageB,它们都派生自包含纯虚拟方法std::string toString()的抽象类IMessage。因此,我可以通过指向基类的指针将每条消息转换为其字符串表示。没关系。然而,我需要以某种方式从字符串中构造消息(具体类型的消息),例如:MessageA* msg = [something].fromString( str )。如果给定的字符串不适合构造MessageA,我希望得到NULL。我可以看到两种方法来完成这项任务:

a) MessageFactorydynamic_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,工厂将发现哪些派生类可以从该字符串中构造,并实例化正确的派生类。