Feuilles de root

Logiciels libres, programmation et économie

Un singleton générique en FreePascal

Le singleton est un patron de conception (design pattern) fréquemment utilisé. Il vise à garantir qu'une classe n'a qu'une seule instance dans un programme, fournit un point d'accès global à cette instance et permet l'initialisation tardive.

La façon la plus simple de l'implémenter est la suivante :

Dans la section interface de l'unité :

{ TSingleton }

    TSingleton = class sealed
    private
        class var
            FInstance : TSingleton;
    public
        {
        @name gets the single instance.
        @return (The single instance)
        }
        class function GetInstance : TSingleton;
        { Destructor }
        destructor Destroy; override;
    end;

Dans la section implementation de l'unité :

class function TSingleton.GetInstance : TSingleton;
begin
    if not Assigned(FInstance) then
        FInstance := TSingleton.Create;
    Result := FInstance;
end;

destructor TSingleton.Destroy;
begin
    FInstance.Free;
    FInstance := nil;
    inherited Destroy;
end;

Cette approche a l'avantage d'être simple mais elle oblige à dupliquer ce code si on souhaite créer plusieurs classes Singleton, à moins d'utiliser l'héritage :

TSettings = class(TSingleton)
//...
end;

Je propose d'utiliser les types génériques pour résoudre de manière plus élégante ce problème.

type

    { TSingleton }

    generic TSingleton<T> = class
    private
        class var
            FInstance : T;
    public
        class function GetInstance : T;
        destructor Destroy; override;
    end;

Dans la section implementation de l'unité :

implementation

{ TSingleton }

class function TSingleton.GetInstance : T;
begin
    if FInstance = nil then
        FInstance := T.Create;
    Result := FInstance;
end;

destructor TSingleton.Destroy;
begin
    FInstance.Free;
    FInstance := nil;
    inherited Destroy;
end;

22 févr. 2014 Marqueurs : ,

Ajouter un commentaire

* Champ obligatoire