Vous êtes sur la page 1sur 4

LP: ISIL Université Cadi Ayyad, École Supérieure de Technologie, Essaouira

Design Pattern – TD n°2


Exercice1 :
Dans cet exercice, on trouve deux classes : une classe Program1 qui se contente, lorsqu’on appelle
go, d’afficher un message (dans la réalité, un traitement particulier aurait lieu), et une classe Client
qui appelle Program1.
public class Client
{
public static void main1()
{
Program1 p = new Program1();
System.out.println("Je suis le main1");
p.go();
}

public static void main2()


{
Program1 p = new Program1();
System.out.println("Je suis le main2");
p.go();
}

public static void main3()


{
Program1 p = new Program1();
System.out.println("Je suis le main3");
p.go();
}
}

public class Program1


{
public Program1()
{
// Le constructeur ne fait rien
}

public void go()


{
System.out.println("Je suis le traitement 1");
}
}

Le diagramme de classe ressemble à ceci :

1. On souhaite rajouter deux classes Program2 et Program3 à notre projet. Ces classes afficheront à
l’écran le même message que Program1, excepté qu’elles y feront apparaître leur numéro de
programme (2 ou 3). Ajoutez ces classes (en dupliquant et modifiant le code de Program1).
LP: ISIL Université Cadi Ayyad, École Supérieure de Technologie, Essaouira
Dans le client, on souhaite modifier le code des fonctions main pour que, selon le paramètre entier qui
leur est passé en argument (1, 2, ou 3), ces dernières lancent le traitement du Program1, Program2 ou
Program3. Pouvez-vous réaliser cette fonctionnalité ?
Voici, en codant de la bonne manière, le diagramme de classe que vous devriez obtenir:

2. En Java, la duplication de code n’est pas souhaitable. Avez-vous, dans les trois fonctions main de
client, dupliqué le code de création des objets Program ? Si c’est le cas, changez votre classe et créez-
y une fonction, appelée par les trois main, qui s’occupera de construire les objets Program.
3. Jusque là, rien de bien nouveau dans ce que l’on a fait. Le problème ici est que les objets
Program1, Program2 et Program3 sont construits dans la fonction main de Client, et ceci n’est pas
souhaitable. On préfèrera déléguer les détails de la construction à une classe spécifique : la Factory.
En effet, s’il y avait plusieurs classes Client, chacune aurait une fonction de création des objets
Program, et si l’on voulait modifier la façon dont les Program sont générés, il faudrait modifier
chacune des fonctions de création des Program dans les classes Client.
Pour éviter ça, on va déléguer la création des objets de type Program à une classe dont le nom sera
ProgramFactory. Les clients devront construire une instance de cette classe afin de pouvoir y utiliser
la fonction de création des Program qui y sera stockée.
Voici le diagramme de classe que vous devriez obtenir :

On voit bien sur le diagramme de classe que le Client n’a plus connaissance de l’existence de
Program1, Program2 ou Program3. Il se contente de voir l’interface ProgramInterface et le
ProgramFactory.
4. Pouvez-vous ajouter un Program4 ? Cela a-t-il été compliqué à mettre en place ? Avez-vous dû
LP: ISIL Université Cadi Ayyad, École Supérieure de Technologie, Essaouira
modifier le code du Client ?
Vous venez d’implémenter le Pattern Factory. Lorsqu’une méthode renvoie une classe parmi
plusieurs classes possibles qui partagent une super-classe commune. Le modèle Factory permet de
créer des objets sans spécifier la classe exacte de l'objet qui sera créé. Il permet au client de ne pas
avoir connaissance du produit (Program1, 2, 3 ou 4), et de déléguer les détails de la production à une
autre classe. Si on souhaite rajouter un produit (un Program), on doit juste éditer la factory. Grâce à la
factory, on évite à la classe Client d'avoir connaissance des différentes instances de
ProgramInterface.

Exercice 2 (Factory et Abstract Factory)

1- Ecrire la classe abstraite Automobile caractérisée par un modèle, une couleur, une puissance et un espace.
Ajouter une méthode afficherCaractéristiques().

2- Ecrire les classes AutomobileElectricité et AutomobileEssence.

3- Ecrire la classe abstraite Scooter caractérisée par un modèle, une couleur et une puissance. Ajouter une
méthode afficherCaractéristiques().

4- Ecrire les classes ScooterElectricité et ScooterEssence.

5- Ecrire l’interface FabriqueVéhicule permettant de créer des Automobiles et des Scooters

6- Ecrire les classes FabriqueVéhiculeElecticité et FabriqueVéhiculeEssence réalisant FabriqueVéhicule


LP: ISIL Université Cadi Ayyad, École Supérieure de Technologie, Essaouira

Exercice 3 (singleton)

1. Ecrire un programme java qui permet de créer une instance de Base de données unique. Cette base de
données possède deux attributs « record » ( n°de l’enregistrement courant) et « name » (nom de la
BdD). Une méthode, « editRecord », qui permet d’éditer un enregistrement dans la BDD (en affichant
seulement que l’enregistrement subit une opération de modification) et une méthode « getName », qui
retourne le nom de la BDD.

2. Testez dans un programme l’unicité de la BdD.

3. Y a-t-il une possibilité de défaillance ?

Exercice 4 (singleton)

Implémentez dans un milieu bancaire le pattern singleton. Tout d’abord vous allez concevoir une classe
CompteBancaire qui permet de déposer ou retirer de l’argent sur un compte. Vous allez afficher les opérations
effectuées dans la console. Pour cela, vous allez implémenter une classe distincte nommée Journalisation
reprenant le pattern Singleton. Ainsi nous allons garantir que notre programme va utiliser une seule et même
instance de la classe Journalisation. Une troisième classe intitulée Main permettra d’exécuter l’application et
d’obtenir un résultat en console.

CompteBancaire
Journalisation
- numero : int
- ………. - solde : double
- log : String
+ CompteBancaire()
…….. + deposerArgent(depot : double)
……. + retirerArgent(retrait : double)
ajouterLog(log : String)
getLog() : String

Main

1. Spécifier l’attribut et les méthodes nécessaires afin que la classe Journalisation soit basée sur le pattern
Singleton. Elle possède aussi deux méthodes, ajouterLog(string) qui permet d'ajouter un message de log
et getLog() qui retourne tous les messages de log.

2. La classe CompteBancaire correspond à un compte. Celui-ci possède un numéro (identifiant) et un


solde. Il est possible de déposer de l’argent ou d’en retirer grâce aux méthodes deposerArgent(double)
et retirerArgent(double). Ces deux dernières méthodes utilisent la classe Journalisation pour tracer les
opérations.

3. La classe Main est la classe principale de notre programme. Elle va permettre d’exécuter un exemple et
d’afficher son résultat en sortie. En effet, sur le compte numéro 123 on va déposer 100 DA et retirer 80
DA. Puis sur le compte 321 on va déposer 200 DA et retirer 110DA.

Vous aimerez peut-être aussi