:: Enseignements :: Master :: M1 :: 2013-2014 :: Programmation Orientée Objet - Design Pattern ::
[LOGO]

Factory


Des usines spécialisées et bien nommées
Le but de ce TD est de mettre en pratique les Design Patterns Factory.

Exercice 1 - Dessinons ...

Dans un premier temps, nous allons chercher à dessiner des rectangles et des lignes à l'écran.
Pour cela, une 'librairie' graphique minimaliste vous est fournie , CanvasArea.java
L'espace à votre disposition a une taille fixe de 800 x 600 pixels à l'écran. Les coordonnées utilisées sont des coordonnées pixels: [0-799] x [0-599]. Classiquement, le point (0,0) est situé en haut à gauche de la fenêtre.
Exemple de ce que votre code doit être capable de faire
      CanvasArea area = new CanvasArea("hello canvas area", 800, 600);
      Line line = new Line(0, 0, 100, 50);
      line.draw(area);
    

  1. Créer une classe Line avec un constructeur prenant les deux points de la ligne en argument.
    Implémentez la méthode draw(CanvasArea) qui dessine la ligne sur le CanvasArea.
    Ecrivez un main de test pour visualiser le résultat.
  2. Créer une classe Rectangle avec un constructeur prenant deux points d'une des diagonales du rectangle en argument.
    Implémentez la méthode draw(CanvasArea) qui dessine le rectangle sur le CanvasArea.
    Modifiez le main de test pour visualiser le résultat.
  3. Pour l'instant, tout est "en dur" dans notre code :(
    On veut pouvoir choisir la forme à afficher au lancement du programme : ajouter un argument au main pour pouvoir choisir la forme à afficher ("rectangle" pour un rectangle et "line" pour une ligne).
    Puis ajouter aussi en arguments de la ligne de commande les coordonnées des deux points pour pouvoir choisir aussi sa position.

Exercice 2 - découplons !

Exercice 3 - Industrialisation

Exercice 4 - nouvelles formes

Exercice 5 - Encore plus souple ?

Un collègue trouve que nos dessins sont moches, manque de couleur, etc... !
Il n'est pas question qu'il modifie nos classes de Shape; par contre, on lui propose de nous fournir sa propre version des classes de Shape.
On ne veut pas avoir à modifier notre programme main ... ou alors vraiment très peu.

  1. Que doit-il minimalement nous fournir ?
    Faites une version simple avec juste un peu de couleur.
    Quelles classes existantes avez-vous modifiées ?
  2. Un autre collègue nous fait la même demande !
    Il semble inconcevable de modifier comme cela sans arrêt notre main(), que pouvez-vous faire pour que l'usine de Shape ne soit pas référencée "en dur" dans le programme main ?
    Pensez à la reflection en Java, à Class.forName() et Class.newInstance.
    Testez votre solution avec les deux hiérarchies de Shape que vous avez implémentées.

Exercice 6 - Move it! [Pour aller plus loin]

On veut pouvoir sélectionner une forme et la faire ensuite bouger.

  1. Après un délai de 3 secondes, Faites bouger la première des formes affichées de (10,30) pixels
    L'astuce pour faire bouger quelque-chose consiste à effacer ce qui était dessiné (en dessinant un rectangle blanc) puis à dessiner la forme à une autre position.
  2. On veut pouvoir faire bouger n'importe quelle forme:
    • Pensez à mémoriser toutes les formes affichées
    • La librairie vous permet d'écouter la souris pour obtenir ses coordonées avec la méthode waitForMouseEvents. Déterminez un algorithme simple pour sélectionner une forme d'après cette coordonnées.
      Pensez à reponsabiliser les formes...
    • Faites bouger la forme sélectionnée
  3. Groupe de formes.
    • Introduisez une nouvelle classe ShapeGrouping pour grouper des formes de base. Pour cette question, on ne s'intéresse pas à la manière dont les groupes sont créés.
    • Comment faites-vous pour faire bouger un groupe ? (soyez astucieux pour que cela soit simple !)