创建具有相同基类型的不同对象。工厂模式?

mar*_*inu 5 java factory producer-consumer

我必须为大学课程实现一个多生产者/多消费者示例应用程序,并且很难找到以下问题的解决方案,这并没有让我觉得我做错了什么;)

我必须实现 aProducer产生给定类型的Component( CPUComponent, MainboardComponent. 公共Component类的所有子类)。a 的每个实例Producer只会产生给定数量的一种类型的组件(例如只有主板),然后退出。

Components为都或多或少不变的对象(仅final字段)和所有逻辑都在共同的基类实现Component(下面简化的)

public abstract class Component implements Serializable
{    
    private final long id;

    public Component(int id) { ... }

    public long getId()
    {
        return id;
    }
}
Run Code Online (Sandbox Code Playgroud)

的子类Component只是原始的,比如

public class CPUComponent extends Component
{
    public CPUComponent(long id) { ... }
}
Run Code Online (Sandbox Code Playgroud)

由于语言是 Java,我无法使用泛型轻松解决此对象生成问题(就像在 C# 中一样,因为我无法在 Java 中实例化泛型类型参数的新对象)。所以我开始实现一个工厂

public interface ComponentFactory {
    Component createComponent(Producer producer, boolean defective);
}
Run Code Online (Sandbox Code Playgroud)

并为每种Component类型提供具体的工厂实现。

我现在的问题是,当我想将生成的组件存储在我的Storage类中(只为消费者管理所有生成的组件)时,我需要弄清楚对象的确切类型(每个CPUComponent等在它自己的架子中) ),但我只Component从工厂得到一个(基本类型)。

所以现在唯一有帮助的就是instanceof,但我认为必须有更好的解决方案来解决我的问题。

我能想到的另一个解决方案Producer是为每种类型实现 a s Component,但我想避免这种方式。

也许我正在考虑复杂的方法并且已经完全过度设计了整个事情。只要指出我正确的方向;)

Bri*_*new 4

基于 OO 是告诉对象为你做事,我会在你的每个组件上调用一个方法store()(在你的基类中定义它abstract),并传入Storage对象。您的子类将以自己的特定方式实现此方法,并与Storage对象进行协调以存储自身。如果您这样做,那么您的Storage类不需要了解不同的组件,并且添加新Component类型只需要该类的定义,而无需在其他地方进行额外的工作。

我注意到,在您的问题中,您给人的印象是您的子类除了基类之外没有其他功能(如果我没有正确阅读它)。正是因为这样的场景,子类应该具有特定于其类型的功能。你是绝对正确的。instanceof。如果您必须使用它,那么它通常表明您没有充分利用面向对象的灵活性和/或您的对象分析不正确。