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
| class Utilisateur
{
public:
Utilisateur(std::string const & n, std::string const & p):name_(n),
firstname_(p){}
virtual ~Utilisateur()
/* à redéfinir pour chaque type dérivé de manière à
* ce qu'il renvoie... le type adéquat, correctement initialisé */
virtual Utilisateur * clone(std::string const & n, std::string const & p
/* , ...*/) const = 0;
};
/* quelques classe dérivant de utilisateur, que je ne présente pas ici */
/* la fabrique */
/* on pourrait envisager l'utilisation d'un singleton, mais, de toute évidence,
* cette fabrique ne sera utilisée... qu'à certains point bien précis.
* Le singleton ne se justifie donc pas vraiment ;)
*/
class Fabrique
{
public:
/* une possibilité parmi d'autres pour déterminer le type
* d'utilisateur que l'on veut obtenir
*/
enum enumType{typeUtilisateur1,
typeUtilisateur2,
typeUtilisateur3};
Fabrique()
{
/* on enregistre tous les types envisagés */
items_.insert(std::make_pair(typeUtilisateur1,new TypeDerive1("",""));
items_.insert(std::make_pair(typeUtilisateur2,new TypeDerive2("",""));
items_.insert(std::make_pair(typeUtilisateur3,new TypeDerive3("",""));
}
/*!!! il n'apparait pas ici, mais il faut veiller à ce que le destructeur
* libère correctement la mémire lors de la destruction de la fabrique ;)
*/
Utilisateur * create(Fabrique::enumType t, std::string const &p,
std::string const & f) const
{
std::map<enumType, Utilisateur *>::const_iterator it=items_.find(t);
return (it==items_.end() ? NULL : it->second->clone(p,f);
}
};
void foo()
{
/* la liste d'utilisateurs :D */
std::list<Utilisateur *> l;
std::string n;
std::string p;
Utilisateur::enumType t;
Fabrique f;
/* récupération des données nécessaires à la création d'un utilisateur
* particulier, et... du type d'utilisateur attendu
*/
l.push_back(f.create(t,p, n));
/* utilisation de l */
/* faudra pas oublier de libérer correctement la mémoire allouée à
* chacun des léments de la liste ;)
*/
} |
Partager