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

时间:2011-11-27 18:57:42

标签: java factory producer-consumer

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

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

Component或多或少是不可变对象(仅final个字段),所有逻辑都在公共基类Component中实现(简化如下)

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

    public Component(int id) { ... }

    public long getId()
    {
        return id;
    }
}

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

public class CPUComponent extends Component
{
    public CPUComponent(long id) { ... }
}

使用Java语言,我无法使用 Generics 轻松解决此对象生成(因为我无法在C#中实现,因为我无法在Java中实例化泛型类型参数的新对象)。所以我开始实施工厂

public interface ComponentFactory {
    Component createComponent(Producer producer, boolean defective);
}

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

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

所以现在唯一有用的东西是instanceof,但我认为必须有一个更好的解决方案来解决我的问题。

我能想到的另一个解决方案是为每种Producer实现Component,但我想避免这种情况。

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

4 个答案:

答案 0 :(得分:4)

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

我注意到在您的问题中,您会给人的印象是您的子类除了基类之外没有其他功能(如果我已正确阅读它)。它;正是因为这样的场景,子类应具有特定于其类型的功能。你是完全正确的。 {{1}}。如果你必须使用它,那么它通常是一个指针,你没有使用OO的完全灵活性和/或你的对象分析不正确。

答案 1 :(得分:1)

1)Java确实支持generics。你是说由于某种原因,在这种情况下Java中的通用支持是不够的?从您的描述看起来您可以使用泛型类型参数化Producer类。

2)从您的描述中,似乎Component可能是enum

答案 2 :(得分:1)

工厂设计模式是利用多态性的一种方式。多态性意味着您的基类具有特定的接口,即它具有一组特定的方法,外部对象将通过这些方法进行通信。派生类可以以自己的方式实现此接口。

最重要的是,如果您的类设计正确,您应该能够通过基类完成所需的一切。 Storage类将存储Components,而Storage类的用户对组件的实际类一无所知;只能通过Component接口使用它们。

答案 3 :(得分:1)

您可以将Component个对象存储在单独的列表中,例如:motherboards = ArrayList<Component>

你是对的,你需要在这里实现工厂模式。

public class ComponentFactory() {
    public Component getComponent(Integer id, String componentType) {
        if (componentType.equals("motherboard"))
            return new MotherboardComponent(id);
        else if(componentType.equals("cpu"))
            return new CpuComponent(id);
        else
            return null;
    }
}

您需要为所有组件子类型实现具体类,所有组件子类都继承自Component基类,如您所愿。