interface type TSingleton = class private FText: string; public procedure FreeInstance; override; class function NewInstance: TObject; override; class function RefCount: Integer; property Text: string read FText write FText; // pour tester end; implementation var TheInstanceOfSingleton: TObject = nil; SingletonRefCount: Integer = 0; procedure TSingleton.FreeInstance; begin Dec(SingletonRefCount); if (SingletonRefCount = 0) then begin TheInstanceOfSingleton := nil; inherited FreeInstance; end; end; class function TSingleton.NewInstance: TObject; begin if not Assigned(TheInstanceOfSingleton) then begin TheInstanceOfSingleton := inherited NewInstance; TSingleton(TheInstanceOfSingleton).Text := 'Dans un premier temps'; end; Result := TheInstanceOfSingleton; Inc(SingletonRefCount); end; class function TSingleton.RefCount: Integer; begin Result := SingletonRefCount; end;
singleton?? what is this?
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 [b]Réponse acceptée[/b] lorsque la réponse vous convient ! [;)] ------------------------------------------- [url]http://diabloporc.free.fr[/url] : mon site refait ! Delphi power !
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
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.
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.
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...
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éé.
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)
ok ! thanks delphiprog !
Si je prend s1:= TSingleton.create; s2:= Tsingleton.create; s1 et s2 on les même adresse mémoire.
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...
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.
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,
Se souvenir du profil
Mot de passe oublié ? / Activation de compteCréer un compte