我正在寻找一种允许单个Cars类包含每个Car对象的解决方案。我不想要其他系列(例如Corvettes,Clunkers)。我也在寻找一种解决方案,该解决方案允许根据单个汽车类型的属性创建Car对象…如前所述,创建新的Corvette类型的Car的速度为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);
而这正是您想要的。
但是,您会在策略和Car之间取得联系。
解决方案2:使用Factory。
Factory也可以解决此问题,并且可能更容易。您要做的是拥有一个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(例如,从数据存储中提取汽车属性)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)