Newer
Older
// ============================================================================
// == ==
// == AMDiS - Adaptive multidimensional simulations ==
// == ==
// ============================================================================
// == ==
// == Institut fr Wissenschaftliches Rechnen ==
// == Zellescher Weg 12-14 ==
// == 01069 Dresden ==
// == germany ==
// == ==
// ============================================================================
// == ==
// == https://gforge.zih.tu-dresden.de/projects/amdis/ ==
// == ==
// ============================================================================
/** \file CreatorInterface.h */
#ifndef AMDIS_CREATORINTERFACE_H
#define AMDIS_CREATORINTERFACE_H
#include "DOFMatrix.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;
virtual BaseClass* create(const DOFMatrix::base_matrix_type& A)
{
/// Can be implemented by sub classes.
virtual void free(BaseClass *) {}
};
/** \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>
{