public static ModeloVehiculo GetCar(string marca, string modelo, string color) { ModeloVehiculo v = null; // Si el modelo ya ha sido creado anteriormente, se recupera del pool if (pool.ContainsKey(marca + " " + modelo + " " + color)) { v = pool[marca + " " + modelo + " " + color]; Console.WriteLine("\t* Recuperando del pool el vehiculo " + marca + " " + modelo + " " + color); } // En caso de que no exista, se instancia un nuevo objeto y se añade al pool. // Las próximas ocasiones en las que el objeto sea utilizado, se devolverá una referencia // al objeto existente, evitando ocupar más memoria en crear una nueva instancia else { // Dependiendo de algún parámetro (por ejemplo, si el modelo tiene el sufijo 'sport'), se // instanciará una clase u otra. if (modelo.EndsWith("sport")) { v = new ModeloDeportivo(marca, modelo, color); } else { v = new ModeloBerlina(marca, modelo, color); } // Se añade el objeto al pool: las sucesivas llamadas usarán este objeto en lugar de // instanciar uno nuevo pool.Add(marca + " " + modelo + " " + color, v); Console.WriteLine("\t* Insertando en el pool el vehiculo " + marca + " " + modelo + " " + color); } return(v); }
// Constructor del vehículo // Hace uso de la factoría para obtener (o generar, en caso de que no exista) la parte implícita de // los datos del vehículo (marca, modelo y color) public Vehiculo(string marca, string modelo, string color, // Datos implícitos string matricula, DateTime fechaMatriculacion, string nifTitular) // Datos explícitos { // Instanciamos o referenciamos los datos implícitos a través de la factoría this.datosImplicitos = VehiculoFactory.GetCar(marca, modelo, color); // Asignamos los datos propios, exclusivos de este objeto this.Matricula = matricula; this.FechaMatriculacion = fechaMatriculacion; this.NifTitular = nifTitular; }