IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Fabrique d'objets

Date de publication : 05 juin 2008

Par Eric GASPARD
 


               Version hors-ligne (Miroir)

I. Introduction
II. Partie A - Implémentation d'une fabrique d'objets
II-A. Pour bien commencer
II-B. La liste persistante
II-C. La fonction de recensement
II-D. La fonction d'instanciation


I. Introduction

Dans ce tutoriel nous verrons comment mettre en place une fabrique d'objets.
Ce mécanisme permet, via un recensement des classes, de créer des objets de manière automatisé.


II. Partie A - Implémentation d'une fabrique d'objets


II-A. Pour bien commencer

Lorsque vous mettez en place une fabrique d'objets, vous devez vous poser deux questions essentielles :

  • Qu'est-ce que vous voulez stocker pour créer vos objets (classe, objet pour réplication, objet pour utilisation directe, etc...) ?
  • Comment voulez-vous identifier chaque élément stocké (code, entier, nom de la classe, etc...) ?
Une fois ces deux questions résolues, vous serez à même de répondre à la troisième à savoir quel conteneur utiliser (tableau, liste soit TStringList, TObjectList, TComponentList, etc...).

Dans la suite de cet article nous partirons du principe de stocker directement les classes dans un TStringList et que l'identifieur sera un code définit par nous-même.


II-B. La liste persistante

Pour pouvoir utiliser la fabrique de classe à tout moment dans l'application nous allons avoir besoin d'une variable globale.

interface
uses Classes;

implementation

var
  ARegObjets: TStringList;
Ensuite nous déclarons un accesseur.

interface
uses Classes;

  function RegObjets: TStringList;
  
implementation

var
  ARegObjets: TStringList;
  
function RegObjets: TStringList;
begin
  if ARegObjets <> NIL then
    ARegObjets := TStringList.Create;
  	
  Result := ARegObjets;
end;
Enfin nous effectuons l'initialisation et la destruction finale de la liste.

interface
uses Classes;

  function RegObjets: TStringList;
  
implementation
uses SysUtils;

var
  ARegObjets: TStringList;
  
function RegObjets: TStringList;
begin
  if ARegObjets <> NIL then
    ARegObjets := TStringList.Create;
  	
  Result := ARegObjets;
end;

Initialization
  ARegObjets := NIL;
Finalization
  if Assigned( ARegObjets ) then
    FreeAndNil( ARegObjets );
info Nous aurions pu ici déclarer notre variable globale dans la section implémentation (la rendant ainsi publique) et l'instancier dans la section Initialization. Néanmoins comme la section Initialization est exécuté dès le démarrage de l'application, il aurait été dommage que l'instance soit créé quoi qu'il arrive même si finalement on ne s'en sert pas.
Il est donc préférable de passer par un accesseur afin que l'instance ne soit créé qu'au bon moment afin d'économiser de la mémoire.

II-C. La fonction de recensement

La fonction de recensement permet d'ajouter le médium pour créer vos objets ainsi que son identifiant au référentiel de la fabrique d'objets. Dans notre exemple il s'agit simplement d'ajouter le code comme un nouvel item dans la liste et la classe comme Object.

interface
  [...]
  procedure RegisterObject( const ACode: String; AClass: TClass );
  
implementation
  [...]
procedure RegisterObject( const ACode: String; AClass: TClass );
begin
  if ( ACode <> '' ) and ( AClass <> NIL ) then
   // vérifier que le code n'est pas déjà présent dans la liste
   if RegObjets.IndexOf( ACode ) = -1 then
    RegObjets.AddObject( ACode, AClass );
end;
info Ici le programme va se comporter de manière silencieuse lorsqu'une tentative de duplication d'un recensement apparaît. Néanmoins rien ne vous empêches de traiter le cas avec un else pour remonter un message d'erreur, une exception ou encore mettre à jour le couple clé/classe avec la nouvelle classe passé.
idea Plutôt que de gérer nous-même la présence de doubles dans la TStringList, nous aurions pu utiliser sa propriété Duplicates avec les valeurs dupIgnore ou dupError qui se chargent déjà de ce travail.

II-D. La fonction d'instanciation




               Version hors-ligne (Miroir)

Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2008 Eric GASPARD. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.