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.