public static IVehicle GetStartedVehicle <TVehicle>()
            where TVehicle : class, IVehicle, new()
        {
            IVehicleFactory factory;

            switch (new TVehicle())
            {
            case Car c:
                factory = new CarFactory();
                break;

            case Truck t:
                factory = new TruckFactory();
                break;

            default:
                throw new NotImplementedException();
            }

            var result = factory.CreateVehicle();

            result.Start();

            //Return IVehicle and NOT TVehicle
            //TVehicle would be the concrete type, we want the abstract type (IVehicle).
            return(result);
        }