A differenza di molte librerie SDL e OpenGL sono progettate per fornire risorse globali; puoi accedervi in qualsiasi momento da qualsiasi classe. Ci sono giustificazioni per questo: sono scritte in C, pensate per essere prontamente multipiattaforma e progettate per essere veloci.
Tuttavia non sono orientati agli oggetti, e lo stato globale dovrebbe essere normalmente un'idea molto cattiva. Aggiunge drammaticamente il numero di ingressi a ogni funzione del tuo codice.
Diciamo che stai lavorando in C ++ o qualche altro linguaggio orientato agli oggetti con una di queste librerie. Sai di quale funzionalità hai bisogno. A quel punto non è una buona idea incapsulare ciò che ti serve nelle classi X e Y e dire "ogni volta che hai bisogno di lavorare con questa libreria, usa X e Y"?
Ad esempio, con SDL, sembra una buona idea avere una classe che chiami SDL_Init nel costruttore e pulisca tutto nel distruttore. Questa classe manager ti consente solo di creare finestre e renderer mentre SDL è attivo.
Una buona causa per un singleton forse? Preferirei di no. Il Blog Test di Google fornisce un buon esempio di un caso contro singleton: link
Quindi in realtà le mie domande sono 1) se incapsulare parte di una libreria è una buona idea o pura follia e 2) come affrontare la gestione delle risorse globali senza singleton.
EDIT: la risposta di Paul K qui fornisce un'introduzione davvero valida e concisa all'iniezione di dipendenza, che elimina la necessità di singleton. Tuttavia non è ancora chiaro come gestire lo stato che è sfortunatamente reso globale da una libreria come OpenGL o SDL. L'ampio stato globale fornito da queste librerie non può essere facilmente passato per riferimento a meno che non sia raccolto insieme e gestito da una classe wrapper. Anche una volta fatto, il client può comunque utilizzare direttamente la libreria.