我必须为大学课程实现多个生产者/多个消费者示例应用程序,并且很难找到解决以下问题的解决方案,这不会让我觉得,我做错了什么;)
我必须实现一个Producer
,它会生成给定类型的Component
(CPUComponent
,MainboardComponent
。所有子类的公共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
,但我想避免这种情况。
也许我正在想复杂的方法,并且已经完全过度设计了整个事情。请指出我正确的方向;)
答案 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基类,如您所愿。