У меня получился следующий набор классов:
- Program – наш корень компоновки, который строит весь граф объектов;
 - Good – описывает товар;
 - Order – описывает заказ;
 - FreeOrder – описывает заказ, за который не нужно платить;
 - Request – описывает запрос к машине;
 - Router – преобразует запрос в команду, а также берёт на себя обязанность формирования заказа;
 - WendingMachine – “помойка”, которая содержит в себе всё, что не захотелось на этом этапе выносить в другие классы. Содержит в себе товары и баланс;
 - ConsoleCommandInput – читает строку с консоли и преобразует её в команду с помощью роутера;
 - Commands:
- AddMoney;
 - BuyGood;
 - GetChange;
 - ShowCommands;
 - Login;
 
 
Есть также у нас чистые абстракции, в виде интерфейсов:
- IOrder;
 - ICommand;
 - ICommandInput;
 
Они позволяют нам абстрагироваться во многих частях кода от того, откуда приходит запрос, какой тип заказа у нас и какую команду нужно выполнять.