抽象类的集合(或类似的东西……)

抽象类的集合(或类似的东西……),第1张

抽象类的集合(或类似的东西……)

我正在寻找一种允许单个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(例如,从数据存储中提取汽车属性)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5616226.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存