Это очень сильно зависит от проблемы, которую вы пытаетесь решить.
Если гарантированно один обработчик для конкретного события, построенного в камне, тогда цепочка ответственности может оказаться слишком сложной, а в целом усложнить систему. Это может превратиться в кошмар обслуживания. Цепочка, содержащая только одно звено, не является цепочкой, и синглтон может быть гораздо лучше.
Однако, если система должна быть настроена более неудачно, с обработчиком для события, более зависимым от определенного контекста, то синглтон будет слишком тесно связан. Если вы нашли себя с кодом вроде:
if (event == "this")
do this
else if (event == "that")
do that
.. в вашем синглтоне, тогда цепь ответственности, вероятно, была бы лучше.
Всегда выбирайте правильный инструмент для правильной работы!
А также не бойтесь менять подходы при необходимости. Если проблема начинается просто, начните с Singleton. Вещи никогда не могут быть более сложными, чем все, и все счастливы. Если со временем все усложняется, и вы замечаете, что вкладываете множество веток в свой одноэлементный код - пора адаптироваться! Разорвите синглтон и включите цепь ... или другой шаблон, если это кажется более подходящим.
Идея сосредоточения внимания на слабосвязанном коде состоит в том, чтобы упростить включение и отключение функциональности, поэтому решение должно существовать столько, сколько нужно.