CRÈATION D'UN SINGLETON

MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 - 28 oct. 2004 à 15:38
pasnox Messages postés 5 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 7 mars 2011 - 3 mai 2007 à 15:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/27143-creation-d-un-singleton

pasnox Messages postés 5 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 7 mars 2011
3 mai 2007 à 15:13
Ta methode de singleton ne fonctionne pas avec les dérivés de TComponent, j'ai une erreur de nom dupliqué à l'initialisation de 2 objects.

P@sNox,
cs_MHI Messages postés 110 Date d'inscription jeudi 7 octobre 2004 Statut Membre Dernière intervention 19 février 2009 1
30 oct. 2004 à 08:35
c'est vrai que c'est un peu déroutant de voir le create de TObject vide. Tous est géré par le newInstance dans un TObject.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
29 oct. 2004 à 22:58
Autant pour moi, tu as mille fois raison.
J'étais persuadé qu'il fallait surcharger la méthode Create.
Et cela est d'autant plus déroutant que la méthode create de TObject est ainsi implémentée :
constructor TObject.Create;
begin
end;
Rien de plus...
cs_MHI Messages postés 110 Date d'inscription jeudi 7 octobre 2004 Statut Membre Dernière intervention 19 février 2009 1
29 oct. 2004 à 19:27
Si je prend

s1:= TSingleton.create;
s2:= Tsingleton.create;

s1 et s2 on les même adresse mémoire.
MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 1
29 oct. 2004 à 19:08
ok ! thanks delphiprog !
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 oct. 2004 à 23:51
Je ne vois pas où l améthode Create est surchargée pour permettre une interception des appels.
Prenons le cas :
implementation
var
Singleton1: TSingleton;

procedure TForm1.Button1Click(Sender: TObjet);
begin
Singleton1 := TSingleton.Create;
end;

procedure TForm1.Button2Click(Sender: TObjet);
begin
Singleton1 := TSingleton.Create;
end;

Je sais l'exemple peut paraître absurde présenté tel quel.
Mais dans le cas où les appels à la méthode Create seraient nettement plus distancés entre eux, dis moi ce qui se passera avec ton code si l'on clique cinq fois sur chacun des deux boutons ?
Combien d'instances auront été créées ?
Comment et par qui ces instances pourront être détruites ?
Je suis curieux de lire ta réponse...:o)
cs_MHI Messages postés 110 Date d'inscription jeudi 7 octobre 2004 Statut Membre Dernière intervention 19 février 2009 1
28 oct. 2004 à 23:38
Lorsque l'on fait un create sur mon singleton il renvoie la même instance que pour un create précédent. Car le newinstance renvoie l'instance de l'objet précédement créé.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 oct. 2004 à 19:54
Pour MoveX :
What is a design pattern ?
[Gam+, page 1] starts quoting and commenting the pattern guru Christopher Alexander who
says: ?Each pattern describes a problem which occurs over and over again in our environment,
and then describes the core of the solution to that problem, in such a way that you can use this
solution a million times over, without ever doing it the same way twice?.

Enjoy...
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 oct. 2004 à 19:36
Le modèle de code donné par MHI n'est pas tout à fait conforme au design pattern Singleton.
En effet, un appel à la méthode Create (héritée de TObject ici) contourne complètement l'effet recherché, à savoir une seule et unique instance de la classe en mémoire.
ModelMaker respecte le design pattern singleton et produit automatiquement le code ci-dessous :
unit USingleton;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs;

type
TSingleton = class (TObject)
protected
constructor CreateInstance;
class function AccessInstance(Request: Integer): TSingleton;
public
constructor Create;
destructor Destroy; override;
class function Instance: TSingleton;
class procedure ReleaseInstance;
end;


procedure Register;

implementation

procedure Register;
begin
end;

{
********************************** TSingleton **********************************
}
constructor TSingleton.Create;
begin
inherited Create;
raise Exception.CreateFmt('Access class %s through Instance only',
[ClassName]);
end;

constructor TSingleton.CreateInstance;
begin
inherited Create;
end;

destructor TSingleton.Destroy;
begin
if AccessInstance(0) = Self then AccessInstance(2);
inherited Destroy;
end;

class function TSingleton.AccessInstance(Request: Integer): TSingleton;

const FInstance: TSingleton = nil;

begin
case Request of
0 : ;
1 : if not Assigned(FInstance) then FInstance := CreateInstance;
2 : FInstance := nil;
else
raise Exception.CreateFmt('Illegal request %d in AccessInstance',
[Request]);
end;
Result := FInstance;
end;

class function TSingleton.Instance: TSingleton;
begin
Result := AccessInstance(1);
end;

class procedure TSingleton.ReleaseInstance;
begin
AccessInstance(0).Free;
end;


end.
---------------
Pour ceux qui ont la chance de disposer de ce logiciel (livré avec Delphi 7), je vous recommande de lire le document "Design pattern Reference's guide" au format pdf (mmdesignpatterns.pdf).
Pour les allergiques à la langue anglaise, vous trouverez également sur http://hcesbronlavau.developpez.com/DesignPatterns/ un très bon didacticiel.
cs_MHI Messages postés 110 Date d'inscription jeudi 7 octobre 2004 Statut Membre Dernière intervention 19 février 2009 1
28 oct. 2004 à 18:30
La notion de Singleton n'est pas nouvelle, beaucoup l'utilise indirectement sans s'en rendre compte un l'intermédiaire un objet qu'il instancie au début de l'appli et se serve de cet objet par l'intermédiaire d'une variable globale.
cs_MHI Messages postés 110 Date d'inscription jeudi 7 octobre 2004 Statut Membre Dernière intervention 19 février 2009 1
28 oct. 2004 à 18:22
Effectivement j'aurai du expliquer ce qu'était un Singleton. Il s'agit bien d'un Design Patterns. Un singleton doit etre unique tous au long de son cycle de vie.

Pour plus d'info sur le Singleton : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpatterns/html/DesSingleton.asp
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
28 oct. 2004 à 15:40
hello,
une petite définition d'un Singleton aurait été la bienvenue :

Le singleton est ce que l'on apelle un design pattern. Son but est d'éviter de multiplier les objets(et donc les ressources en mémoire) identiques. Autrement il offre la possibilité d'utiliser un même(on parle souvent d'unicité) objet tout au long d'un programme, ce qui permet donc d'améliorer votre application.
[source : google]

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! [;)]

-------------------------------------------
[url]http://diabloporc.free.fr/url : mon site refait ! Delphi power !
MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 1
28 oct. 2004 à 15:38
singleton?? what is this?
Rejoignez-nous