java - 将属性封装在属性/上下文类中

标签 java

我创建了一个具有不同实现的BicycleProducer接口(interface):OffroadBicycleProducerFastBicycleProducer等等。

每个工厂都需要许多参数才能生产自行车。我想将这些属性封装在一个类中并将其传递给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 {

    //..
}

最佳答案

我发现您提出的设计有两点有点尴尬:

  1. 对我来说,看起来您可能根本不需要工厂(即您的 Producer 类)。当您需要构造编译时类型未知的对象时,工厂非常有用。但由于您正在考虑为每种类型的自行车创建单独的工厂类(例如 OffroadBicycleProducer),我假设您确实知道要提前构造哪种对象。

  2. 使用上下文类来使参数传递不那么难看是一个好主意,但如果您开始为每种类型的自行车创建单独的上下文类,那么您最终会陷入尴尬的境地,必须知道要构造哪个上下文以及它需要什么数据 - 如果您拥有所有这些,您不妨跳过中间步骤并立即构造 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/

相关文章:

java - 类型与 lambda 不匹配

java - Glassfish 使用 URL 重写,即使我没有关闭 cookie

Java 不可达声明

java/ant jar 文件 SecurityException

JAVA:在创建时设置成员数据,而不使用构造函数

java - 我如何查看 Java 应用程序中调用的每个方法?

java - 在 Gradle 中,有没有办法将 JDK 设置为 Eclipse Default?

java - 开放声明中的这个错误是什么?

java - 如何从 Java 应用程序将 JTable 数据发送到打印作业?

java - Sonar 死存储到本地变量 NumberFormat java