Está en la página 1de 4

#include<iostream>

#include <string>

/*Para minimizar el tamaño del ejemplo decidi colocar las propiedades de las clases
de forma publica
quiero señalar que esto es solo para propositos didacticos. Lo mejor es seguir la
regla que las
propiedades se declaren privadas y secreen los metodos set y get, como he dejado
indicado en la clase llantas.
*/
class Llantas {
int tamanio;

public:
int getTamanio()
{
return tamanio;
}
void setTamanio(int t)
{
this->tamanio = t;
}

};

class Puertas {
public:
int cantidad;
};

class Motor {
public:
int cfuerza;
};

class Cuerpo {
public:
std::string partes;
};

class Vehiculo {
public:
Llantas* llantas;
Puertas* puertas;
Motor* motor;
Cuerpo* body;
void especificaciones()
{
std::cout << "Cuerpo:" <<body->partes<< std::endl;
std::cout << "Motor:" << motor->cfuerza << std::endl;
std::cout << "Primera Llanta:" << llantas->getTamanio() << std::endl;
std::cout << "Segunda Llanta:" << (llantas+1)->getTamanio() <<
std::endl;
std::cout << "Tercera Llanta:" << (llantas + 2)->getTamanio() <<
std::endl;
std::cout << "Cuarta Llanta:" << (llantas + 3)->getTamanio() <<
std::endl;
}
};

class Builder
{
public:
virtual Llantas* getLlantas() = 0;
virtual Motor* getMotor() = 0;
virtual Cuerpo* getBody() = 0;

};

class Director
{
Builder* builder;
public:
void setBuilder(Builder* nbuilder)
{
builder = nbuilder;

}
Vehiculo* getVehiculo()
{
Vehiculo* veh = new Vehiculo();
veh->body = builder->getBody();
veh->motor = builder->getMotor();

veh->llantas = builder->getLlantas();

return veh;
}

};

class JeepBuilder :public Builder


{
public:

Llantas* getLlantas()
{
Llantas* llanta=new Llantas[4];

llanta[0].setTamanio(22);
llanta[1].setTamanio(25);
llanta[2].setTamanio(26);
llanta[3].setTamanio(23);
return llanta;
}

Motor* getMotor()
{
Motor* m = new Motor();
m->cfuerza = 400;
return m;
}
Cuerpo* getBody()
{
Cuerpo* c = new Cuerpo();
c->partes = "SUV";
return c;
}

};

class NissanBuilder :public Builder


{
public:

/*Llantas* getLlantas()
{
Llantas* llanta = new Llantas();
llanta->tamanio = 16;
return llanta;
}*/
Llantas* getLlantas()
{
Llantas* llanta = new Llantas[4];

llanta[0].setTamanio(22);
llanta[1].setTamanio(23);
llanta[2].setTamanio(25);
llanta[3].setTamanio(26);
return llanta;
}

Motor* getMotor()
{
Motor* m = new Motor();
m->cfuerza = 85;
return m;
}

Cuerpo* getBody()
{
Cuerpo* c = new Cuerpo();
c->partes = "hatchback";
return c;
}

};

class HiBuilder :public Builder


{
public:

Llantas* getLlantas()
{
Llantas* llanta = new Llantas();
llanta->setTamanio(22);
return llanta;
}

Motor* getMotor()
{
Motor* m = new Motor();
m->cfuerza = 90;
return m;
}

Cuerpo* getBody()
{
Cuerpo* c = new Cuerpo();
c->partes = "hatchback";
return c;
}

};

int main()
{
Vehiculo* v; //producto final
Director director;//controla el proceso de produccion o creacion de los
objetos
JeepBuilder jb;// constructores o builders de cada tipo de elemento de la
realidad(vehiculos)
NissanBuilder nb;
std::cout << "JEEP" << std::endl;
director.setBuilder(&jb);
v = director.getVehiculo();
v->especificaciones();
std::cout << "NISSAN" << std::endl;
director.setBuilder(&nb);
v = director.getVehiculo();
v->especificaciones();
return 0;
}

También podría gustarte