Как видишь получилась вариация твоего третьего варианта, с вытекающими (описанными тобой) неудобствами.
В следующем дизайне я постарался свести эти неудобства к минимуму:
Всё что относится к управлению параметрами, вынесено в отдельный абстрактный класс ParameterManager.
Остается неудобство, что надо следить, чтобы id не пересекались.
Это можно делать в одном месте — у controlObject в addParamToAlg()
(на диаграмме этот метод не показан). Это должен делать controlObject, т.к. только он имеет доступ ко
всем контурам и общим параметрам.
Не уверен, что верно изобразил использование синглтона CommonParams (в виде зависимости).
И еще, я бы серьезно подумал, чтобы разделить controlObject на два — один контроллер и один представляющий состояние контролируемого объекта.