title: Design pattern to refactor switch statement
body: <p>I have something like the following in the header</p>
  
  <pre><code>class MsgBase
  {
    public:
      unsigned int getMsgType() const { return type_; }
      ...
    private:
      enum Types { MSG_DERIVED_1, MSG_DERIVED_2, ... MSG_DERIVED_N };
      unsigned int type_;
      ...
  };
  
  class MsgDerived1 : public MsgBase { ... };
  class MsgDerived2 : public MsgBase { ... };
  ...
  class MsgDerivedN : public MsgBase { ... };
  </code></pre>
  
  <p>and is used as</p>
  
  <pre><code>MsgBase msgHeader;
  // peeks into the input stream to grab the
  // base class that has the derived message type
  // non-destructively
  inputStream.deserializePeek( msgHeader ); 
  unsigned int msgType = msgHeader.getMsgType();
  
  MsgDerived1 msgDerived1;
  MsgDerived2 msgDerived2;
  ...
  MsgDerivedN msgDerivedN;
  
  switch( msgType )
  {
    case MSG_DERIVED_1:
      // fills out msgDerived1 from the inputStream
      // destructively
      inputStream.deserialize( msgDerived1 );
      /* do MsgDerived1 processing */
      break;
    case MSG_DERIVED_2:
      inputStream.deserialize( msgDerived2 );
      /* do MsgDerived1 processing */
      break;
    ...
    case MSG_DERIVED_N:
      inputStream.deserialize( msgDerivedN );
      /* do MsgDerived1 processing */
      break;
  }
  </code></pre>
  
  <p>This seems like the type of situation which would be fairly common and well suited to refactoring.  What would be the best way to apply design patterns (or basic C++ language feature redesign) to refactor this code?</p>
  
  <p>I have read that the Command pattern is commonly used to refactor switch statements but that seems only applicable when choosing between algorithms to do a task.  Is this a place where the factory or abstract factory pattern is applicable (I am not very familiar with either)?  Double dispatch?</p>
  
  <p>I've tried to leave out as much inconsequential context as possible but if I missed something important just let me know and I'll edit to include it.  Also, I could not find anything similar but if this is a duplicate just redirect me to the appropriate SO question.</p>