シングルトンの問題の 1 つは、ほとんどの場合、その使用が制御の反転の原則 (またはSOLIDに関する依存関係の反転) を破ることです。
Singleton は、複数のオブジェクトの作成を防止するだけでなく、コード内のどこからでもこのオブジェクトにアクセスできるようにします。オブジェクトの作成/アクセス方法を変更することにした場合、たとえば static 経由でアクセスする必要があると予想されるコード内のすべての場所を変更する必要があるため、これは悪いことですSingletonClass.GetInstance()
。
また、単体テストを実装する場合、実際のオブジェクトの代わりにモックを使用することが必要になることがよくあります。あなたの状況では、モジュールを単体テストする必要があり、そのモジュールが を介して実際のオーディオ出力にアクセスした場合、SingletonClass.GetInstance()
実際のオーディオ出力をスタブに置き換えることは非常に難しくなります。
一方、モジュールが依存性注入を介してオーディオ出力オブジェクトを取得した場合(たとえば、コンストラクターに渡されるパラメーターとして)、テスト中に、実際のオーディオ出力オブジェクトの代わりに、同じインターフェイスを実装したスタブを注入できます。
もちろん、そのようなオブジェクトを注入するレベルでは、シングルトンを使用して一度に 1 つのインスタンスしか存在しないようにすることができます。重要な点は、基礎となるコードは、オブジェクトの数や取得方法を気にするべきではないということです。それは、注入されたもので機能するだけです。
要するに、Singleton が本当に必要だと思われる場合は、Singleton を使用できますが、グローバル状態としてアクセスすることは許可しないでください。