|
|
|
|
Le kit |
|
|
 |
|
|
|
|
|
12 Avril 2003 |
|
|
Version 1.0 |
|
|
Par Sébastien MERIC |
|
|
Remerciements : Stefan Bertholon |
|
Synonymes
Fabrique abstraite, usine abstraite
Synopsis
Construire son application, construire l'architecture de base applicative est l'un des
premiers rôles de votre programme : un point d'entrée (fonction mail en C, méthode static main en
C++ et en java, etc.) qui va construire l'application, pourtant l'architecture peut être
différente d'un appel à l'autre. Un bon exemple pour les adeptes de java et pour ceux qui font
du SWING (interface graphique fenêtrée), c'est de choisir la couche de peinture à utiliser
(windows like, motif like ou metal le spécial java). Il nous faut, dans ce cadre, être capable
de construire la quasi-même arborescence mais avec des implémentations différentes.
C'est ce que se propose de résoudre le kit.
Notre problématique est donc de permettre à un client de choisir un style
(pas nécessairement graphique et l'exemple sera non graphique) puis de commencer à fabriquer
son architecture objet à l'aide d'une interface unique. La solution consiste donc à utiliser
des interfaces, et ce à tous les niveaux. D'une part, au niveau des objets faisant réellement
l'objet de manipulation (ici les objets graphiques comme une fenêtre, un arbre, un tableau) et
aussi au niveau d'une usine à fournir les objets en question.
Structure
Le besoin, cette fois, est de bien définir les interfaces, fabrication et utilisation, pour
permettre d'utiliser diverses implémentations du même composant puis d'implémenter ce composant
dans au moins l'une de ses versions (attendu que les autres viendront bien entendu).

Implémentation
Pour l'exemple implémenté, je ne fournirais qu'une seule implémentation d'un composant, le reste
allant de soi. Un exemple très connu de kit pour les utilisateurs de java est le processus
de création d'instance de classes du JDBC. Nous allons faire pour l'exemple un tout petit
driver de persistance. Il ne disposera que d'une seule classe d'utilisation pour que le
code ne soit pas trop important et ne sera capable que de lire un enregistrement ou d'en
insérer un nouveau. Enfin, j'implémenterais partiellement une instance du composant pour fichier
csv et une autre (toujours partielle) pour fichier xml.
com.developpez.kit.KitSerialisation
/*
* KitSerialisation.java
*
* Created on 14 mars 2003, 16:35
*/
package com.developpez.kit;
/**
*
* @author smeric
*/
public interface KitSerialisation {
public Serialisation getSerialisationInstance();
// ici il faudrait ajouter des get pour tous les objets que l'on pourrait
// avoir besoin de construire
// ex :
/*public Enregistrement getEnregistrmentInstance(); */
/*public Champ getChampInstance(); */
// et du coup définir les interfaces Enregistrement et Champs ainsi que
// leurs différentes implémentations
}
com.developpez.kit.Serialisation
/*
* KitSerialisation.java
*
* Created on 14 mars 2003, 16:22
*/
package com.developpez.kit;
/**
*
* @author smeric
*/
public interface Serialisation {
/** Récupère la valeur du champs numéro <i>index</i>.<p>
* La valeur est récupérée sous forme de chaîne de caractères.
* @param index le numéro d'ordre du champs à récupérer
* @throws SerialisationException si l'index est trop grand ou si une
* erreur d'entrée sortie se produit.
* @return la valeur si elle est trouvée sous forme de chaîne de
* caractères.
*/
public String get(int index) throws SerialisationException;
/** Insert un nouvel enregistrement dans le fichier.
* @param values un tableau des valeurs à insérer.
* @throws SerialisationException si une erreur d'entrée sortie se produit.
*/
public void insert(String[] values) throws SerialisationException;
}
com.developpez.kit.SerialisationException
/*
* SerialisationException.java
*
* Created on 14 mars 2003, 16:32
*/
package com.developpez.kit;
/**
*
* @author smeric
*/
public class SerialisationException extends java.lang.RuntimeException {
/**
* Creates a new instance of <code>SerialisationException</code> without detail message.
*/
public SerialisationException() {
}
/**
* Constructs an instance of <code>SerialisationException</code> with the specified detail message.
* @param msg the detail message.
*/
public SerialisationException(String msg) {
super(msg);
}
}
com.developpez.kit.KitSerialisationCsv
/*
* KitSerialisationCsv.java
*
* Created on 14 mars 2003, 16:41
*/
package com.developpez.kit;
/**
*
* @author smeric
*/
public class KitSerialisationCsv implements KitSerialisation {
/** Creates a new instance of KitSerialisationCsv */
public KitSerialisationCsv() {
}
public Serialisation getSerialisationInstance() {
return new SerialisatoinCsv();
}
}
com.developpez.kit.KitSerialisationXml
/*
* KitSerialisationXml.java
*
* Created on 14 mars 2003, 17:10
*/
package com.developpez.kit;
/**
*
* @author smeric
*/
public class KitSerialisationXml implements KitSerialisation {
/** Creates a new instance of KitSerialisationXml */
public KitSerialisationXml() {
}
public Serialisation getSerialisationInstance() {
return new SerialisationXml();
}
}
com.developpez.kit.SerialisationCsv
/*
* SerialisationCsv.java
*
* Created on 14 mars 2003, 17:07
*/
package com.developpez.kit;
/**
*
* @author smeric
*/
public class SerialisationCsv implements Serialisation {
/** Creates a new instance of SerialisationCsv */
public SerialisationCsv() {
}
/** Récupère la valeur du champs numéro <i>index</i>.<p>
* La valeur est récupérée sous forme de chaîne de caractères.
* @param index le numéro d'ordre du champs à récupérer
* @throws SerialisationException si l'index est trop grand ou si une
* erreur d'entrée sortie se produit.
* @return la valeur si elle est trouvée sous forme de chaîne de
* caractères.
*/
public String get(int index) throws SerialisationException {
throw new SerialisationException("A implémenter");
}
/** Insert un nouvel enregistrement dans le fichier.
* @param values un tableau des valeurs à insérer.
* @throws SerialisationException si une erreur d'entrée sortie se produit.
*/
public void insert(String[] values) throws SerialisationException {
throw new SerialisationException("A implémenter");
}
}
com.developpez.kit.SerialisationXml
/*
* SerialisationXml.java
*
* Created on 14 mars 2003, 17:07
*/
package com.developpez.kit;
/**
*
* @author smeric
*/
public class SerialisationXml implements Serialisation {
/** Creates a new instance of SerialisationXml */
public SerialisationXml() {
}
/** Récupère la valeur du champs numéro <i>index</i>.<p>
* La valeur est récupérée sous forme de chaîne de caractères.
* @param index le numéro d'ordre du champs à récupérer
* @throws SerialisationException si l'index est trop grand ou si une
* erreur d'entrée sortie se produit.
* @return la valeur si elle est trouvée sous forme de chaîne de
* caractères.
*/
public String get(int index) throws SerialisationException {
throw new SerialisationException("A implémenter");
}
/** Insert un nouvel enregistrement dans le fichier.
* @param values un tableau des valeurs à insérer.
* @throws SerialisationException si une erreur d'entrée sortie se produit.
*/
public void insert(String[] values) throws SerialisationException {
throw new SerialisationException("A implémenter");
}
}
|