en C # Vous devez tout déclarer dans une classe, un exemple de modèle d'usine pourrait donc ressembler à: en C ++, vous n'avez pas cette limitation .. Alors est-il considéré comme "mauvaise pratique". Pour avoir des méthodes "usine", des fonctions globales vs sont une classe? p> exemple 1: p> exemple 2: p> namespace MySpace {
// factory class with no global function
class CFactory
{
public:
std::shared_ptr<CBase> CreateBase() { return NULL; }
public:
static CFactory& getFactory()
{
static CFactory singleton;
return singleton;
}
};
}
4 Réponses :
Voici un exemple de moyen d'implémenter singleton en
C ++
De cette façon, vous pouvez éviter le global.
J'espère que cela t'aides.
Oui, la fonction globale n'est pas requise dans le deuxième exemple. Mon objectif était davantage sur le motif d'usine et non le modèle singleton :)
Ouais, après avoir lu votre op à nouveau, j'ai réalisé que vous parliez à la place de l'usine. ma faute. Peut-être que quelqu'un va le trouver utile cependant. = P
Je préfère: Exemple & Exemple :: GetExampleObject () {Exemple statique TheInstance; retourner theinstance; } code> de cette façon, vous n'aurez pas à vous soucier des pointeurs NULL
Vous pouvez présumer à partir de son utilisation dans la bibliothèque standard qu'une usine mondiale de noms de noms n'est pas implicitement em> mal. Rien ne l'empêche d'être correct. P>
Votre approche d'emballage de l'usine dans une classe est un changement d'organisation em> d'organisation. L'organisation elle-même n'est ni bonne ni mauvaise. Cela peut être bien fait bien ou mal. P>
Vous devriez aller bien faire une approche à l'aise pour son contexte. J'ai également vu les deux approches utilisées à plusieurs reprises et non plus particulièrement problématiques. P>
Les fonctions libres sont correctes en C ++ et j'irais avec cet itinéraire. P>
Un peu indépendant: pourquoi retournez-vous un pointeur intelligent partagé d'une usine? La propriété de l'objet nouvellement créé va-t-elle toujours être partagée? P>
Dans le code en fait, oui, il est partagé. :) Désolé pour la confusion
Je recommande toujours de mettre les fonctions dans une classe (et même de les rendre virtuels). C'est très agréable de pouvoir remplacer votre usine pour un certain nombre de raisons et faire des choses de cette manière plus faciles. P>
Dans la bibliothèque standard, les fonctions d'usine existent en grande partie parce que l'expansion des modèles de fonction peut être basée sur les types d'arguments, mais jusqu'à ce que c ++ 17 ne puisse pas avoir de classes de modèle qui créent des instances de la classe sur la base des types nourris au constructeur. Donc, ces fonctions d'usine sont plus correctement considérées comme des constructeurs non membres qu'une usine. Ils retournent toujours une instance d'un type particulier par exemple. P>
dans une usine "vraie", l'usine peut renvoyer n'importe quel type qui implémente l'interface spécifiée ou dérivé du type spécifié. Les vraies usines renvoient toujours des pointeurs ou (dans des instances rares), mais pas des instances réelles. P>
J'ai tendance à mettre un
statique FOO * make () code> ou similaire à l'intérieur de la classe de base code> FOO code>. Je ne comprends vraiment pas ce qui se passe avec le singleton dans votre deuxième exemple ...
J'ai ajouté l'exemple 3 pour supprimer la fonction globale du singleton. Mon objectif est davantage sur le modèle d'usine, mais d'autres ont également été confondus par l'exemple 2.