begin process at 2012 05 27 19:42:44
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > CRÈATION D'UN SINGLETON

CRÈATION D'UN SINGLETON


 Information sur la source

Note :
Aucune note
Catégorie :Divers Niveau :Initié Date de création :28/10/2004 Vu :5 021

Auteur : MHI

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Crèation d'un objet Singleton

utilisation

  s1 := TSingleton.Create;
  s2 := TSingleton.Create;
  ShowMessage(s1.Text);
  s2.Text := 'Pour finir !!';
  ShowMessage(s1.Text);
  s2.Free;
  s1.Free;

Source

  • 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;
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;



 Sources du même auteur

Source avec Zip UTILISATION DE FONCTION CONTENUE DANS UNE DLL
Source avec Zip COMPOSANT TTHUMB
FONCTION CONVERSION CHIFFRE ROMAIN EN CHIFFRE
CONSTITUTION RÉCURSIVE DE LISTE DE RÉPERTOIRE

 Sources de la même categorie

Source avec Zip DISTANCE ENTRE DEUX POINTS GEOGRAPHIQUES par jponselle
Source avec Zip LECTURE DE FICHIER .EML par piette
Source avec Zip TRI DBRID CROISSANT ET DECROISSANT par walidlam
Source avec Zip PETITE APPLICATION DE RETENUE par walidlam
Source avec Zip APPLICATION ALIAS+EXCEL par walidlam

Commentaires et avis

Commentaire de MoveX le 28/10/2004 15:38:12

singleton?? what is this?

Commentaire de JulioDelphi le 28/10/2004 15:40:50 administrateur CS

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 !

Commentaire de MHI le 28/10/2004 18:22:10

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

Commentaire de MHI le 28/10/2004 18:30:02

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.

Commentaire de Delphiprog le 28/10/2004 19:36:51 administrateur CS

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.

Commentaire de Delphiprog le 28/10/2004 19:54:50 administrateur CS

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...

Commentaire de MHI le 28/10/2004 23:38:58

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éé.

Commentaire de Delphiprog le 28/10/2004 23:51:13 administrateur CS

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)

Commentaire de MoveX le 29/10/2004 19:08:21

ok ! thanks delphiprog !

Commentaire de MHI le 29/10/2004 19:27:58

Si je prend

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

s1 et s2 on les même adresse mémoire.

Commentaire de Delphiprog le 29/10/2004 22:58:26 administrateur CS

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...

Commentaire de MHI le 30/10/2004 08:35:06

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.

Commentaire de pasnox le 03/05/2007 15:13:08

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,

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales