データベースと相互作用するシステムがあるとします。システムはデータベースを非常に頻繁に使用するため、ほぼすべてのサブルーチンは次のパターンに従います。
foo(database, rest, of, arguments)
これはすぐにわかります。fooはより大きなオブジェクトの一部であるため、接続変数はオブジェクト変数に移動されます。残念ながら、これはすべてのモデルオブジェクトのコンストラクターがこの引数を取ることを意味します。
そこで、データベースへの接続を生成できるモジュールを作成することにしました。データベースへの接続にはコストがかかるため、接続はキャッシュされ、そのキャッシュされた値は将来の呼び出しで返されます。
作成したのはシングルトンです。これは、開発コミュニティで一般的に嫌われているパターンです。繰り返しになりますが、DRYは推奨される原則であり、シングルトンパターンが推奨されない場合よりもさらに重要です。
では、どちらが良いですか?オプションは、すべての関数呼び出し(または少なくともコンストラクター)に入る引数の数を増やすか、シングルトンを作成することです。私が見ない3番目のオプションはありますか?
編集:シングルトンに反対する記事はhttp://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspxです。そこで提示された議論は理にかなっていると思います。私は、反シングルトン陣営がこの設計問題の解決策を持っていることを望んでいました。