// ============================================================================ // == == // == AMDiS - Adaptive multidimensional simulations == // == == // ============================================================================ // == == // == crystal growth group == // == == // == Stiftung caesar == // == Ludwig-Erhard-Allee 2 == // == 53175 Bonn == // == germany == // == == // ============================================================================ // == == // == http://www.caesar.de/cg/AMDiS == // == == // ============================================================================ /** \file CreatorInterface.h */ #ifndef AMDIS_CREATORINTERFACE_H #define AMDIS_CREATORINTERFACE_H namespace AMDiS { /** \ingroup Common * \brief * Interface for the implementation of the factory method pattern. * The creation of an object of a sub class of BaseClass is deligated * to a corresponding sub class of Creator<BaseClass>. So it is possible to * manage a CreatorMap, which can be extended at run-time. An example is * the OEMSolverMap: If you write your own OEMSolver sub class and a * corresponding Creator<OEMSolver<T> >, you can add the creator together * with a key string to the OEMSolverMap. Then you can create an OEMSolver * depending of a key string read from the init file, which can also be * your own new solver. */ template<typename BaseClass> class CreatorInterface { public: virtual ~CreatorInterface() {}; /** \brief * Must be implemented by sub classes of CreatorInterface. * Creates a new instance of the sub class of BaseClass. */ virtual BaseClass* create() = 0; /** \brief * Can be implemented by sub classes. */ virtual void free(BaseClass *) {}; /** \brief * */ virtual bool isNullCreator() { return false; }; }; /** \brief * A Creator which creates no object abd returns NULL instead. * Used together with the key word 'no' in CreatorMap. */ template<typename BaseClass> class NullCreator : public CreatorInterface<BaseClass> { /** \brief * Creates no object. */ BaseClass* create() { return NULL; }; /** \brief * */ virtual bool isNullCreator() { return true; }; }; } #endif