begin process at 2008 09 06 08:12:47
1 237 654 membres
53 nouveaux aujourd'hui
14 313 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CRÈATION D'UN SINGLETON


Information sur la source

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;
  • signaler à un administrateur
    Commentaire de MoveX le 28/10/2004 15:38:12

    singleton?? what is this?

  • signaler à un administrateur
    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 !

  • signaler à un administrateur
    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

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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...

  • signaler à un administrateur
    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éé.

  • signaler à un administrateur
    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)

  • signaler à un administrateur
    Commentaire de MoveX le 29/10/2004 19:08:21

    ok ! thanks delphiprog !

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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...

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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

Pub



Appels d'offres

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS