Я полностью согласен с Орионом Эдвардсом, и обычно так я подхожу к проблеме; но в последнее время я начинаю видеть некоторые шаблоны (!) безумия.
Для более сложных задач я обычно использую что-то вроде интерпретатора (или стратегии ), в котором используется какой-то строитель (или фабрика ) для создания каждой части данных.
Для потоковой передачи данных весь синтаксический анализатор будет выглядеть примерно как адаптер , адаптирующийся от объекта потока к потоку объекта (который обычно является просто очередью).
В вашем примере, вероятно, был бы один компоновщик для полной структуры данных (от головы до EOF), который внутренне использует компоновщики для внутренних элементов данных (передаваемых интерпретатором). Как только EOF будет обнаружен, объект будет испущен.
Однако объекты, созданные в операторе switch в некоторой фабричной функции, являются, вероятно, самым простым способом для многих менее важных задач. Кроме того, мне нравится, когда мои объекты данных остаются неизменными, поскольку вы никогда не знаете, когда кто-то подсунет вам параллелизм:)