Problèmes liés à la création d’objets
Dans la plupart des langages à objets, la création d’objets se fait grâce au mécanisme d’instanciation qui consiste à créer un nouvel objet par appel de l’opérateur new paramétré par une classe (et éventuellement des arguments du constructeur de la classe dont le but est de donner aux attributs leur valeur initiale). Un tel objet est donc une instance de cette classe.
Les langages les plus utilisés aujourd’hui comme PHP, Java, C++ ou C# utilisent le mécanisme de l’opérateur new.
Dans certains cas, il est nécessaire de paramétrer la création d’objets. Prenons l’exemple d’une méthode construitDoc qui crée des documents. Elle peut construire des documents PDF, RTF ou HTML. Généralement le type du document à créer est transmis en paramètre à la méthode sous forme d’une chaîne de caractères, ce qui donne le code suivant :
class ConstructeurDocument
{
protected Document $resultat;
public function construitDoc(string $typeDoc): Document
{
if ($typeDoc == 'PDF') {
$resultat = new DocumentPDF();
} elseif ($typeDoc == 'RTF') {
$resultat = new DocumentRTF();
} else {
$resultat = new DocumentHTML();
}
// suite de la méthode
}
}
Cet exemple nous montre qu’il est difficile de paramétrer le mécanisme de création d’objets. L’utilisation d’instructions conditionnelles dans le code du client est souvent pratiquée avec l’inconvénient que chaque changement dans la hiérarchie des classes à instancier demande des modifications dans le code des clients. Dans notre exemple, il faut changer le code de la méthode construitDoc en cas d’ajout de nouvelles classes de document.
La difficulté est encore plus grande quand il faut construire des objets composés dont les composants peuvent être instanciés à partir de classes différentes. Par exemple, une liasse de documents peut être formée de documents PDF, RTF ou HTML. Le client doit alors connaître toutes les classes possibles des composants et des composés. Chaque modification dans ces ensembles de classes devient alors très lourde à gérer.
Solutions proposées par les design patterns de construction
Les design patterns Abstract Factory, Builder, Factory Method et Prototype proposent une solution pour paramétrer la création d’objets. Dans le cas des design patterns Abstract Factory, Builder et Prototype, un objet est utilisé comme paramètre du système. Cet objet est chargé de l’instanciation des classes. Ainsi toute modification dans la hiérarchie des classes n’entraîne que des changements dans cet objet.
Le design pattern Factory Method propose un paramétrage basé sur les sous-classes de la classe cliente. Ces sous-classes implémentent la création des objets. Tout changement dans la hiérarchie des classes entraîne par conséquent une modification de la hiérarchie des sous-classes de la classe cliente.
Pour cet article, nous avons utilisé le livre ‘Design Patterns en PHP‘ comme source principale pour explorer les aspects théoriques des Design Patterns. Cette ressource a été très utile pour comprendre les concepts clés et les applications pratiques de ces modèles de conception.