1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| class Voiture /* L'objet complexe */
{
private:
std::string portiere;
std::string siege;
public:
void setPortiere(std::string p);
void setSiege(std::string s);
friend std::ostream &operator<<(std::ostream &o,const Voiture *v);
};
void Voiture::setPortiere(std::string p) { portiere=p; }
void Voiture::setSiege(std::string s) { siege=s; }
std::ostream &operator<<(std::ostream &o,const Voiture *v)
{
return o << "Portière en " << v->portiere << " et signe en " << v->siege;
}
class MonteurVoiture /* Le monteur/builder : définit l'interface des méthodes utiles à l'assemblage de l'objet */
{
protected:
Voiture *v;
public:
void createVoiture();
Voiture *getVoiture();
virtual void addPortiere() =0;
virtual void addSiege() =0;
static MonteurVoiture* instanceVoiture(std::string type);
};
void MonteurVoiture::createVoiture()
{
v=new Voiture();
}
Voiture* MonteurVoiture::getVoiture() { return v; }
class MonteurVoitureLuxe : public MonteurVoiture /* ConcreteBuilder : va assembler les différents composants de l'objet */
{
public:
void addPortiere();
void addSiege();
};
void MonteurVoitureLuxe::addPortiere() { v->setPortiere("Acier blindé"); }
void MonteurVoitureLuxe::addSiege() { v->setSiege("Cuir"); }
class MonteurVoitureOrdinaire : public MonteurVoiture /* ConcreteBuilder : va assembler les différents composants de l'objet */
{
public:
void addPortiere();
void addSiege();
};
void MonteurVoitureOrdinaire::addPortiere() { v->setPortiere("Tôle"); }
void MonteurVoitureOrdinaire::addSiege() { v->setSiege("Tissu"); }
class Atelier /* Director qui va executer les méthodes du monteur */
{
private:
MonteurVoiture *monteur;
public:
Atelier(MonteurVoiture *m) { monteur=m; }
Voiture *doTheJob();
};
Voiture* Atelier::doTheJob()
{
monteur->createVoiture();
monteur->addPortiere();
monteur->addSiege();
return monteur->getVoiture();
}
MonteurVoiture* MonteurVoiture::instanceVoiture(std::string type)
{
if(type=="luxe") return new MonteurVoitureLuxe();
else return new MonteurVoitureOrdinaire();
} |
Partager