Мне нужно реализовать пример приложения с несколькими производителями / несколькими потребителями для университетского курса, и мне трудно найти решение следующей проблемы, которая не заставляет меня чувствовать, что я делаю что-то не так;)
Мне нужно реализовать 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). Итак, я начал внедрять Factory
public interface ComponentFactory {
Component createComponent(Producer producer, boolean defective);
}
И предоставьте конкретные фабричные реализации для каждого Component
типа.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я хочу сохранить созданные компоненты в моем классе Storage
(просто управляю всеми производимыми компонентами для потребителей), мне нужно выяснить точный тип объектов (каждый CPUComponent
и т. Д. В нем. собственная полка), но с завода я получаю только Component
(базовый тип).
Так что единственное, что сейчас могло бы помочь, это instanceof
, но я думаю, что должно быть лучшее решение моей проблемы.
Другое решение, которое я могу придумать, - реализовать Producer
s для каждого типа Component
, но я хотел избежать этого.
Может быть, я думаю о том, чтобы все усложнить, и уже полностью перестроил все это. Просто укажите мне правильное направление;)
Component
s запрашивают конкретный тип компонента (например, 1 материнскую плату), поэтому я хочу хранить их отдельно, а не в одномCollection<Component>
- person maruchinu   schedule 27.11.2011