Technologie Orientée Objet TD2

publicité
Technologie Orientée Objet TD2
Exercice 1 : Le clonage en Java
On considère une application de gestion bancaire. L'application gère une banque possédant des clients.
L'opération createClient() permet de créer un nouveau client dans la banque.
On veut réaliser des tests sur l'application sans affecter les instances des classes existantes dans
l'application.
Remarque : la classe Client est celle du TD1, elle est maintenant dotée d'un constructeur sans
paramètres.
Fichier Banque.java
package comptebancaire;
import java.util.Vector;
public class Banque implements Cloneable{
private Vector<Client> _clients;
public Banque (){
_clients = new Vector<Client>();
}
public Client createClient(){
Client c = new Client();
_clients.add(c);
return(c);
}
public int getNbClients(){
return(_clients.size());
}
@Override
public Banque clone() throws CloneNotSupportedException {
return((Banque) super.clone());
}
}
Fichier Main.java
package comptebancaire;
public class Main {
public static void main(String[] args) {
Banque banque = new Banque();
Client c1 = banque.createClient();
System.out.println(banque.getNbClients());
try {
Banque banqueClone = banque.clone();
Client c2 = banqueClone.createClient();
System.out.println(banque.getNbClients()+ " "+
banqueClone.getNbClients());
} catch (CloneNotSupportedException ex) {
System.err.println(ex.getMessage());
}
}
}
Donnez la trace d'exécution de la fonction main.
Quel est le problème de la méthode actuelle de clonage?
Que faut-il modifier dans les classes Banque et Client pour réaliser le clonage, dit « profond »,
nécessaire à la réalisation des tests?
Exercice 2 : Le clonage en C++
On considère la classe Client de l'exercice 4 du TD1. On veut rajouter un constructeur sans paramètres.
Donner le code C++ nécessaire. Quel est la condition qu'il faut maintenant vérifier dans le constructeur
par copie?
On considère la déclaration de la classe Banque ci-après :
Fichier Banque.h
#include <vector>
class Banque {
public:
Banque();
Banque(const Banque& orig);
virtual ~Banque();
Client* createClient();
int getNbClients();
private:
std::vector<Client*> _clients;
};
Comment réaliser le clonage de la banque? Donner le code nécessaire (du pseudo-code algorithmique
peut être utilisé si besoin est).
Exercice 3 : Attributs de classe
On souhaite pouvoir connaître le nombre d'instances d'une classe A. A dispose pour cela d'un accesseur
public Entier getNbInstances() qui renvoie le nombre d'instances de A sans avoir besoin de
construire cette classe.
Donnez le code C++ et Java de A.
Exercice 4 : Patron de conception « Singleton »
On souhaite limiter le nombre d'instances d'une classe B à une unique instance. De plus, on souhaite
pouvoir retrouver cette instance n'importe où dans l'application. B dispose pour cela d'un accesseur
public B getInstance() . Cet accesseur a la responsabilité de créer l'instance de la classe B si
elle n'existe pas déjà.
Donnez le code C++ et Java de B.
Téléchargement