Я ищу решение, которое позволяет одному классу Cars содержать каждый объект Car.Я не хочу разные коллекции (например, корветы, кланкеры).Я также ищу решение, которое позволяет создавать объекты Car на основе атрибутов отдельного типа автомобиля ... как упоминалось ранее, создание нового автомобиля типа Corvette приведет к скорости 0,9.Не должно быть другого способа указать скорость автомобиля.
О, о, о, мальчик, есть так много способов справиться с этим, что мы могли бы продолжать весь день!Я сделаю мозговую свалку, и, надеюсь, вам не составит большого труда разобраться.
решение 1: используйте Стратегию.
Стратегияв основном способ отделить тяжелую заменяемую логику от другого класса.В этом случае каждый автомобиль нужно создавать по-своему.Стратегия для этого идеальна.
Извините, если я случайно смешал C # с каким-то образом ... прошло много времени с тех пор, как я сделал java.
public interface CarCreationStrategy{
void BuildCar(Car theCar);
}
public class CorvetteStrategy implements CarCreationStrategy{
public void BuildCar(Car theCar){
theCar.Type = "Corvette";
theCar.Speed = 0.9;
theCar.Comments = "Speedster!";
}
}
public class ToyotaStrategy implements CarCreationStrategy{
public void BuildCar(Car theCar){
theCar.Type = "Toyota";
theCar.Speed = "0.5";
theCar.Comments = "Never dies, even if you drop it from the top of a building";
}
}
Теперь вы можете передать стратегию вс вашим автомобилем конструктор.
public class Car{
// Variables ...
public Car(CarCreationStrategy strategy, int year){
strategy.BuildCar(this); // Implements your properties here.
this.year = year;
}
}
Итак, что вы получаете сейчас, это так здорово!
List<Car> cars = new List<Car>();
cars.Add(new Car(new CorvetteStrategy(),1999));
cars.Add(new Car(new ToyotaStrategy(),2011);
И это будет делать именно то, что вы хотите.
Однако,вы получаете связь между стратегией и автомобилем.
решение 2: используйте Фабрику.
Фабрика также подходит для этого и являетсянаверное проще.То, что вы делаете, - это CarFactory, с несколькими фабричными методами для создания каждого типа автомобиля.
public class CarFactory{
public static Car BuildCorvette(int year){
Car car = new Car(year);
car.Type = "Corvette;
car.Speed = 0.9";
return car;
}
public static Car BuildToyota(int year){
Car car = new Car(year);
car.Type = "Toyota;
car.Speed = 0.5";
return car;
}
}
Использование:
List<Car> cars = new List<Car>();
cars.Add(CarFactory.BuildCorvette(1999));
cars.Add(CarFactory.BuildToyota(2011));
Так что хорошо, что вы этого не делаететеперь надо беспокоиться о создании экземпляра Car.все это обрабатывается CarFactory, отделяя вашу "логику создания экземпляров" от вашего кода.Однако вам все равно нужно знать, какую машину вы хотите построить, и соответственно вызывать этот метод, что все еще является малой связью.
решение 3: фабрика стратегий!
Итак, если мы хотим избавиться от этого последнего кусочка муфт, давайте объединим их вместе!
public class CarFactory{
public static Car BuildCar(CarCreationStrategy strategy, int year){
Car car = new Car(year);
strategy.BuildCar(car);
return car;
}
}
List<Car> cars = new List<Car>();
cars.Add(CarFactory.BuildCar(new CorvetteStrategy(),1999));
cars.Add(CarFactory.BuildCar(new ToyotaStrategy(),2011);
Теперь у вас есть Стратегия по созданию автомобилей, Фабрика, которая их строит для вас,и автомобиль без лишних сцеплений от вашего оригинала.Замечательно, не правда ли?
Если вы работали с Swing, вы заметите, что именно так они обрабатывают несколько вещей, таких как макеты (GridBagLayout, GridLayout - все стратегии).Также есть BorderFactory.
Улучшение
Абстрактная стратегия
public interface CarCreationStrategy{
void BuildCar(Car theCar);
}
public class AbstractStrategy:CarCreationStrategy{
public string Type;
public double Speed;
public string Comments;
public void BuildCar(Car theCar){
theCar.Type = this.Type;
theCar.Speed = this.Speed;
theCar.Comments = this.Comments;
}
}
public class CorvetteStrategy extends AbstractStrategy{
public CorvetteStrategy(){
this.Type = "Corvette";
this.Speed = 0.9;
this.Comments = "Speedster!";
}
}
public class ToyotaStrategy extends AbstractStrategy{
public ToyotaStrategy{
this.Type = "Toyota";
this.Speed = "0.5";
this.Comments = "Never dies, even if you drop it from the top of a building";
}
}
Использование этого дает вам гибкость для создания AbstractStrategies на лету (скажем, потянувсвойства автомобиля из хранилища данных).