Я бы четко разделил модель и вид.
Таким образом, фабрика не может одновременно создавать «элементы бизнес / модели», такие как симулятор, и элементы пользовательского интерфейса, такие как SimulatorDisplay. Поэтому я бы использовал две фабрики. Один для бизнес-элементов, один для элементов пользовательского интерфейса.
Я бы избегал использования наследования для решения всех возможных проблем. Так что больше не заставляйте SimulatorDisplay наследовать от JPanel. Я бы использовал поле JPanel в SimulatorDisplay и создал бы интерфейс 'HasPanel' с методом getPanel () внутри него.
Я бы не стал напрямую предоставлять полный симулятор подписчикам, а использовал бы реальный механизм слушателя, который обеспечивает только общедоступное состояние симулятора вместо самого симулятора.
В общем, не злоупотребляйте Abstracts классом и наследованием в Java (исключая, может быть, из интерфейсов). Вы действительно ограничены, если Java не поддерживает множественное наследование. Но даже если в большинстве случаев это не так полезно.