Я обычно создаю слой абстракции. это оборачивает простой интерфейс для вызовов библиотеки, которые вы используете, давая вам возможность ввести любое состояние (например, переменные), которое вам нужно.
тогда вы можете выставлять только то, что вам нужно и использовать, а также добавлять свое собственное состояние, проверять и удобно решать все вопросы библиотеки из одного места. «проблемы» могут возникать по нескольким причинам - это могут быть потоки, ресурсы, состояние или нежелательные изменения поведения в разных версиях.
Большинство библиотек не предназначены для использования только через синглтон. в таких случаях лучше (субъективно) создавать интерфейсы, как вы это обычно делаете, - конечно же, помня об ограничениях, стоящих за уровнем абстракции. в этом смысле вы просто создаете объектно-ориентированные интерфейсы, которые делятся на размер / задачу / цель / функциональность - все, как вы обычно делаете при написании собственных классов.
если вам не нужна библиотека повсюду, то я думаю, что также полезно обернуть то, что вам нужно, чтобы минимизировать зависимости (что становится все более важным в больших проектах).
если вы используете библиотеку повсеместно, то вы также можете предпочесть использовать вызовы без уровня абстракции.