/usr/include/terralib/kernel/TeAbstractFactory.h is in libterralib-dev 4.0.0-3build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | /************************************************************************************
TerraLib - a library for developing GIS applications.
Copyright © 2001-2007 INPE and Tecgraf/PUC-Rio.
This code is part of the TerraLib library.
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.
You should have received a copy of the GNU Lesser General Public
License along with this library.
The authors reassure the license terms regarding the warranties.
They specifically disclaim any warranties, including, but not limited to,
the implied warranties of merchantability and fitness for a particular purpose.
The library provided hereunder is on an "as is" basis, and the authors have no
obligation to provide maintenance, support, updates, enhancements, or modifications.
In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
indirect, special, incidental, or consequential damages arising out of the use
of this library and its documentation.
*************************************************************************************/
/*! \file TeAbstractFactory.h
\brief Implements a template for the Abstract Factory pattern
*/
#ifndef __TERRALIB_INTERNAL_NEW_FACTORY_H
#define __TERRALIB_INTERNAL_NEW_FACTORY_H
#include "TeDefines.h"
#include <map>
#include <string>
using std::map;
using std::string;
//! Implements a template for the Abstract Factory pattern.
/*
This file implements a templated version of the Abstract Factory Pattern
See: "Design Patterns - Elements of Reusable Object-Oriented Software", by Gamma et. al
page 87.
\author Gilberto Camara, Lúbia Vinhas
*/
template <typename PRODUCT, // The product to be made
typename PARAMS, // The parameter necessary to make the product
typename PRODUCTIDTYPE=std::string> // The type used to identify the product
class TeAbstractFactory
{
public:
//! To link each product to its factory
typedef map<PRODUCTIDTYPE, TeAbstractFactory<PRODUCT,PARAMS,PRODUCTIDTYPE>* > TeFactoryMap;
//! Returns the single instance of the factory registration
static TeFactoryMap& instance()
{
static TeFactoryMap Fmap_;
return Fmap_;
}
protected:
//! Builds a new product from a set of parameters (should be implemented by descendants)
virtual PRODUCT* build(PARAMS* /*arg*/)
{
return PRODUCT::DefaultObject();
}
//! Builds a new product without parameters (should be implemented by descendants)
virtual PRODUCT* build()
{
return PRODUCT::DefaultObject();
}
public:
//! Factory Constructor
/*
\param prodId the identification of the product that the factory produces
*/
TeAbstractFactory(PRODUCTIDTYPE prodId);
//! Destructor
virtual ~TeAbstractFactory() {}
//! Virtual constructor: make the product from some arguments
/*
\param arg a pointer to an structure that contains the arguments
necessary to build the product. The type of product has to be extracted
from the arguments
*/
static PRODUCT* make(PARAMS* arg);
//! Virtual constructor: explictly identifies which product should be made
static PRODUCT* make(PRODUCTIDTYPE prodId);
private:
PRODUCTIDTYPE productIdentification_;
};
// Factor Constructor
template <typename PRODUCT, typename PARAMS, typename PRODUCTIDTYPE>
TeAbstractFactory<PRODUCT,PARAMS,PRODUCTIDTYPE>::TeAbstractFactory(PRODUCTIDTYPE prodId):
productIdentification_(prodId)
{
TeAbstractFactory<PRODUCT,PARAMS,PRODUCTIDTYPE>::instance()[prodId] = this;
}
//! Builds an object, based on the input parameters
template <typename PRODUCT, typename PARAMS, typename PRODUCTIDTYPE>
PRODUCT*
TeAbstractFactory<PRODUCT,PARAMS,PRODUCTIDTYPE>::make(PRODUCTIDTYPE producId)
{
// try to find the name on the factory dictionary
typename TeFactoryMap::iterator i = TeAbstractFactory<PRODUCT,PARAMS,PRODUCTIDTYPE>::instance().find(producId);
// Not found ? return the Default Object
if (i == TeAbstractFactory<PRODUCT,PARAMS,PRODUCTIDTYPE>::instance().end())
return PRODUCT::DefaultObject();
// Create an object, based on the input parameters
return (*i).second->build();
}
//! Builds an object, based on the input parameters
template <typename PRODUCT, typename PARAMS, typename PRODUCTIDTYPE>
PRODUCT*
TeAbstractFactory<PRODUCT,PARAMS,PRODUCTIDTYPE>::make(PARAMS* arg)
{
// If there are no arguments or factory identification return the default object
if (!arg)
return PRODUCT::DefaultObject();
PRODUCTIDTYPE productId = arg->getProductId();
// try to find the name on the factory dictionary
typename TeFactoryMap::iterator i = TeAbstractFactory<PRODUCT,PARAMS,PRODUCTIDTYPE>::instance().find(productId);
// Not found ? return the Default Object
if (i == TeAbstractFactory<PRODUCT,PARAMS,PRODUCTIDTYPE>::instance().end())
return PRODUCT::DefaultObject();
// Create an object, based on the input parameters
return (*i).second->build(arg);
}
#endif
|