Недавно я писал код, подобный этому:
messagehandler.h:
#include "message.h"
class MessageHandler {
public:
virtual ~MessageHandler() {}
virtual void HandleMessage(Message *msg) = 0:
};
persistmessagehandler.h:
MessageHandler *CreatePersistMessageHandler();
persistmessagehandler.cpp:
#include "messagehandler.h"
#include "persist.h"
class PersistMessageHandler : public MessageHandler {
private:
PersistHandle ph;
size_t count;
InternalCheck();
public:
PersistMessageHandler(int someParam);
virtual ~PersistMessageHandler ();
virtual void HandleMessage(Message *msg):
};
PersistMessageHandler::PersistMessageHandler(int someParam)
{
ph.Initialize();
}
... rest of implementation.
MessageHandler *CreatePersistMessageHandler(int someParam)
{
return new PersistMessageHandler(someParam);
}
Причина в том, чтобы скрыть PersistMessageHandler. Клиентам не нужно включать заголовок для класса PersistMessageHandler со всеми включениями и типами, которые могут потребоваться для реализации, а также для более четкого разделения интерфейса и реализации.
, В любом случае, он всегда будет динамически распределен,
Все пользователи PersistMessageHandler просто вызовут CreatePersistMessageHandler (..); прямо или косвенно получить один с завода.
Но. Я не видел, чтобы этот подход использовался в других местах. Это хорошая практика? Есть ли другие / лучшие альтернативы для простых случаев?