Examen de Génie Logiciel Orienté Objet - IFT-2901
Trimestre Automne 2010
Question 1 : Les Design Patterns
A) Patterns de création (35 points)
Concevez un jeu de Babyfoot paramétrable permettant de créer des joueurs avec une apparence 2D ou 3D.
De plus, les joueurs en 2D ou 3D peuvent avoir une texture de surface standard (plain) ou une texture avec effets d'ombres (shaded).
La classe ServerBabyfoot (classe concrète) est responsable de créer la table de jeu BabyfootTable (classe concrète).
La table, à son tour, doit créer 20 joueurs à l'aide d'une usine, tout en garantissant qu'un seul exemplaire de la table existe lors de sa création.
Utilisez les patterns AbstractFactory, FactoryMethod et Singleton pour ce design.
Notez clairement toutes les classes abstraites et concrètes ainsi que le niveau d'accès (private, protected, public) des attributs et méthodes.
Explications et exemples attendus
Pour implémenter AbstractFactory avec FactoryMethod, une interface ou classe abstraite PlayerFactory doit être définie avec une méthode abstraite createPlayer().
Les classes concrètes Player2DFactory et Player3DFactory héritent de cette interface et fournissent des implémentations spécifiques pour créer des joueurs 2D ou 3D.
Le pattern Singleton doit être appliqué à BabyfootTable pour garantir qu'une seule instance de la table existe.
B) Patterns structurels (35 points)
Traitez cette question indépendamment des questions précédentes.
La classe ServerBabyfoot et la classe BabyfootTable existent déjà. Chaque joueur (classe concrète Player) s'exécute sur des machines différentes via un réseau Ethernet.
Pour optimiser les communications, la table utilise le pattern Proxy pour interagir avec les joueurs.
Le proxy transmet les requêtes aux joueurs réels uniquement si nécessaire (il conserve des informations de base localement et ne transmet pas la requête si l'information est déjà disponible).
Vous disposez de la classe PlayerGameboy qui offre les fonctionnalités de base requises pour la classe Player, mais vous souhaitez ajouter un effet visuel de surbrillance via le pattern Decorator.
Concevez le diagramme de classes incluant les classes réelles ServerBabyfoot, BabyfootTable, Player et PlayerGameboy, en utilisant les patterns Proxy, Decorator et Adapter.
Incluez toutes les classes abstraites et concrètes nécessaires.
Les interfaces des classes Player et PlayerGameboy sont les suivantes :
C) Patterns comportementaux (30 points)
Traitez cette question indépendamment des questions précédentes.
La classe ServerBabyfoot et la classe BabyfootTable existent déjà.
Un objet de la classe BallBabyfoot (Singleton) appartient à l'objet BabyfootTable et représente la balle du jeu.
La classe GoalBabyfoot représente un but du jeu de Babyfoot.
On souhaite utiliser le pattern Observer pour que les objets de la classe GoalBabyfoot soient notifiés des changements de position de la balle BallBabyfoot sur la table.
La position de la balle est définie par deux coordonnées cartésiennes sur la table.
Concevez le diagramme de classes décrivant les liens entre les classes mentionnées.
Ajoutez toutes les classes abstraites et concrètes nécessaires pour implémenter ce design.
FAQ
1. Quels sont les principaux avantages des design patterns ?
Les design patterns offrent des solutions éprouvées à des problèmes récurrents en ingénierie logicielle.
Ils améliorent la réutilisabilité du code, facilitent la maintenance et permettent une meilleure communication entre développeurs.
2. Comment s'assurer qu'une classe utilise bien le pattern Singleton ?
Le pattern Singleton est généralement implémenté en rendant le constructeur privé et en fournissant une méthode statique publique pour accéder à l'instance unique.
Il est aussi recommandé de surcharger l'opérateur d'affectation pour éviter la duplication de l'instance.
3. Pourquoi utiliser le pattern Observer pour la communication entre la balle et les buts ?
Le pattern Observer permet de découpler les objets observés (comme la balle) des objets observateurs (comme les buts).
Ainsi, si la position de la balle change, tous les buts concernés sont automatiquement notifiés sans nécessiter de modifications directes dans leur code.