我创建了一个具有不同实现的BicycleProducer
接口(interface):OffroadBicycleProducer
、FastBicycleProducer
等等。
每个工厂都需要许多参数才能生产自行车。我想将这些属性封装在一个类中并将其传递给product
方法。然而,自行车需要不同的属性 - 有些可能是相同的 - 我想知道如何正确地做到这一点。在 BicycleProducer 的接口(interface)中,我当前有一个名为 Produce 的方法,该方法采用参数 BicycleProducingContext ,该参数是具有所有公共(public)属性的接口(interface)。然后,您可以实现它并根据自行车的类型添加必要的属性。然后你需要在 Produce
方法中对其进行转换......但我不知道。我觉得这似乎有点狡猾(也可能不是)。
这是一个很好的方法还是我应该以其他方式进行?
public interface BicycleProducer {
void produce(BicycleProducingContext context);
}
public class OffroadBicycleProducer implements BicycleProducer {
public void produce(BicycleProducingContext context) {
context = (OffroadBicycleProducingContext) context;
}
}
和
public interface BicycleProducingContext {
int numberOfBicycles();
void brand(String brand);
}
public class OffroadBycycleProducingContext implements BicycleProducingContext {
//..
}
最佳答案
我发现您提出的设计有两点有点尴尬:
对我来说,看起来您可能根本不需要工厂(即您的
Producer
类)。当您需要构造编译时类型未知的对象时,工厂非常有用。但由于您正在考虑为每种类型的自行车创建单独的工厂类(例如OffroadBicycleProducer
),我假设您确实知道要提前构造哪种对象。使用上下文类来使参数传递不那么难看是一个好主意,但如果您开始为每种类型的自行车创建单独的上下文类,那么您最终会陷入尴尬的境地,必须知道要构造哪个上下文以及它需要什么数据 - 如果您拥有所有这些,您不妨跳过中间步骤并立即构造
Bicycle
。
如果我正确地假设您确实知道需要提前构造什么类型的对象,那么我将不使用工厂,而是使用构建器模式或普通的旧构造函数。构造函数方法可能如下所示:
public abstract class Bicycle {
private int year;
private String color;
public Bicycle(BicycleProducingContext context) {
this.year = context.getYear();
this.color = context.getColor();
}
}
public class OffroadBicycle extends Bicycle {
private String terrainType;
public OffroadBicycle(BicycleProducingContext context) {
super(context);
this.terrainType = context.getTerrainType();
}
}
public class FastBicycle extends Bicycle {
private int maxSpeed;
public FastBicycle(BicycleProducingContext context) {
super(context);
this.maxSpeed = context.getMaxSpeed();
}
}
如果您直到运行时才知道要构造什么类型的Bicycle
,那么您可以将上述方法与单个工厂结合使用。例如:
public class BicycleFactory {
public static Bicycle constructBicycle(BicycleProducingContext context) {
if (context.getBicycleType().equals("OffroadBicycle")) {
return new OffroadBicycle(context);
} else if (context.getBicycleType().equals("FastBicycle")) {
return new FastBicycle(context);
} else {
throw new IllegalArgumentException("Encountered unrecognized Bicycle type: " + context.getBicycleType());
}
}
}
我希望我没有过度简化您的用例,但在我看来,上面的内容应该可以满足您的需求。
关于java - 将属性封装在属性/上下文类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13278003/