As it turns out, a DynamicMessage needs to construct extra information about its type in order to operate. Most of this information can be shared between all DynamicMessages of the same type. But, caching this information in some sort of global map would be a bad idea, since the cached information for a particular descriptor could outlive the descriptor itself. To avoid this problem, DynamicMessageFactory encapsulates this "cache". All DynamicMessages of the same type created from the same factory will share the same support data. Any Descriptors used with a particular factory must outlive the factory.
before:
after:
Google docs on DynamicMessageFactory encourage reusing them, because the class is essentially a cache mechanism: https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.dynamic_message