Fabrique d'objets
Date de publication : 05 juin 2008
Par
Eric GASPARD
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 );
|
|
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
if RegObjets.IndexOf( ACode ) = -1 then
RegObjets.AddObject( ACode, AClass );
end ;
|
|
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é.
|
|
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
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.