factory.hpp
Go to the documentation of this file.
/*
CLAW - a C++ Library Absolutely Wonderful
CLAW is a free library without any particular aim but being useful to
anyone.
Copyright (C) 2005-2011 Julien Jorge
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
contact: julien.jorge@gamned.org
*/
#ifndef __CLAW_FACTORY_HPP__
#define __CLAW_FACTORY_HPP__
#ifdef CLAW_FACTORY_IS_SINGLETON
#include <claw/basic_singleton.hpp>
#endif
#include <claw/exception.hpp>
#include <map>
namespace claw
{
namespace pattern
{
class bad_type_identifier:
public exception
{
public:
bad_type_identifier() throw()
: exception("No type has this identifier.")
{ }
}; // class bad_type_identifier
template<typename BaseClass, typename IdentifierType>
#ifdef CLAW_FACTORY_IS_SINGLETON
class factory:
public basic_singleton< factory<BaseClass, IdentifierType> >
#else
class factory
#endif
{
private:
class class_creator_base
{
public:
virtual ~class_creator_base();
virtual BaseClass* create() const = 0;
}; // class class_creator_base
template<typename Derived>
class class_creator:
public class_creator_base
{
public:
virtual Derived* create() const;
}; // class class_creator
typedef IdentifierType identifier_type;
typedef BaseClass base_class;
typedef std::map<identifier_type, class_creator_base*> class_map;
public:
~factory();
template<typename T>
bool register_type( const identifier_type& id );
base_class* create( const identifier_type& id ) const;
bool is_known_type( const identifier_type& id ) const;
private:
class_map m_classes;
}; // class factory
} // namespace pattern
} // namespace claw
#include <claw/impl/factory.tpp>
#endif // __CLAW_FACTORY_HPP__
basic_singleton.hpp
A (really) basic implementation of the singleton design pattern.
claw::exception::exception
exception(const std::string &msg)
Constructor.
Definition exception.hpp:50
claw::pattern::bad_type_identifier::bad_type_identifier
bad_type_identifier()
Constructor.
Definition factory.hpp:55
claw::pattern::factory
The design pattern of the factory allow to dynamically instanciate classes of various types given an ...
Definition factory.hpp:79
exception.hpp
A simple class to use as exception with string message.
claw::pattern
Here are the design patterns.
Definition basic_singleton.hpp:38
claw
This is the main namespace.
Definition algorithm.hpp:34