このようなQ&Aを見かけました。
Java - シングルトンがなぜ必要なのか(36721)|teratail
7件も回答が付いているものの全体的に「同じクラスのインスタンスが複数作られないように」という点について述べており、**そこじゃないんだよ!**という結果になっております。
そこじゃないんです。よろしいですか、インスタンスを1個しか作っていけないようなクラスがあるならば、それはそもそもインスタンス化させる必要のないクラス、メソッドをすべてstaticメソッドとして装備したクラスであればよいのです。
シングルトンパターンの意義を説明するには「なぜstaticメソッドとして用意すればいいものをわざわざ遠回りしてシングルトンパターンにするのか」を説明しなければいけないのです。
そこを押さえずにシングルトンパターンの書き方だけ憶えていると、こういうことを言われてしまう。
ハンマー釘病はソフトウェア業界における深刻な病です。私の独自調査によると、singletonクラスの9割はデザパタハンマー釘病患者によって書かれています。
— 葛 (@kudzu) 2016年5月24日
では、staticメソッドにしない意義は何ですかと。上記の質問のベストアンサーで触れているSystem.out
を例にとるなら、なぜSystem.println
というメソッドが用意されておらず、シングルトンout
を通じてSystem.out.println
と呼び出さないといけないか。
それは、out
がPrintStream
インターフェースを実装しているからです。PrintStream
インターフェースを軸に、プログラムを変更することなく出力先を自由に差し替えられる仕組みとして提供されているからです。一般化して、シングルトンパターンを使う理由はこう説明しないといけないのです。
「本来staticメソッドとして提供したい機能だがそれではインターフェースを実装できないのでインスタンスメソッドとして提供する。このときに多重インスタンス化を避けるため。」