III. Design pattern singleton▲
Le motif de conception singleton permet de définir une classe pour qu'il ne puisse avoir
qu'une seule instance de cette classe.
Une exemple d'un singleton peut être l'objet Application en Lazarus qui contient les paramètres
et les méthodes de systemes d'une application, ou encore une Classe System qui contiendrait les détails
de l'environnement de travail Linux par exemple. Vous conviendrez avec moi, qu'il ne doit pas existant
plusieurs instance d'objet System puisque l'environnement de travail en unique en soit.
III-A. Implémentation▲
L'implémentation la plus simple serait d'avoir une méthode static dans la classe qui contient l'instance de l'objet crée
Unit
USingleton;
Interface
Type
TSingleton : class
begin
private
TSingleton instance; static
;
private
constructor
create();
public
class
function
getInstance() : TSingleton;
end
;
Implementation
constructor
TSingleton.create();
begin
end
;
class
function
TSingleton.getInstance() : TSingleton;
begin
if
(instance == null)
instance := TSingleton.create();
result := instance;
end
;
End
.
L'attribut instance étant statique, il n'est donc pas lié une instance de classe mais à la classe elle même. Nous pouvons alors,
verifier lors de l'appel de la méthode de classe -classe statique- qu'il n'existe qu'une seule instance de la classe TSingleton à chaque fois.
En mettant le constructeur de lasse private, il ne sera donc pas possible de contruire directement un objet de cette classe sans passer par le
méthode getInstance().
Nous pouvons alors obtenir l'instance de la classe TSingleton par :
var
singleton : TSingleton;
singleton := TSingleton.getInstance();
III-B. Mauvaise pratique▲
Très souvent en pascal, on peut voir une implémentation du design pattern Singleton de la maniere suivante :
Type
TMauvaseParique : class
begin
{ ... }
end
;
var
Application : TMauvaseParique;
implemenation
Begin
Application = TMauvaseParique.create();
End
.
Puis par convention, nous pouvons nous dire qu'il ne faudra pas qu'un développeur instantie un autre objet de la classe TMauvaseParique,
mais qu'il faut utiliser l'objet referencié par la variable Applcation.
Ce cas résulte avant tout d'une erreur de conception si on tient compte des possibilités que nous offre le langage Pascal.