こちらの記事について社内外でちょっとした議論になったので、その内容をまとめてみました。
Singletonパターンを利用する理由は「外部からnewさせたくないから」だと思っていましたが、「そう書いた方がわかりやすいから」「staticではないメソッドも利用可能になるから」という理由の方が大きそうです。
【指摘】
・privateコンストラクタを持った時点でnewできない
newさせたくないだけなら、オブジェクト取得メソッドは不要。
Singletonパターンで無くても良い。
・Singletonパターンの思想の表現としてオブジェクト取得メソッドが必要
書籍ではSingletonパターンはオブジェクト取得メソッドが必要とされている。
確かに、privateでオブジェクトを1つ生成、外部にはメソッド経由で提供する、とすれば、「オブジェクトは1つのみ存在する」という思想をわかりやすく表現できる。
人によってstaticの方が分かりやすいかSingletonパターンの方が分かりやすいかは違うと思うが、オブジェクト指向に慣れた技術者であればSingletonパターンの方が設計思想が分かりやすいというのはありそう。
・Singletonパターンだとstaticではないメソッドも参照可能になる
Singletonパターンであればクラスへの参照ではなくオブジェクトへの参照となる。
そのため、staticではないメソッドの参照も可能となる。
具体的には、継承・オーバーライドができるというメリットがある。
【サンプルコード】
・StaticMemory.java
・SingletonMemory.java
・SingletonMemoryChild.java
・MemoryTestMain.java
【実行結果】
この話、社内でちょっとした議論になりました。
おかげで色々理解が深まりました。
議論のきっかけを作れるというのも、技術ブログの良い所だと思いました。
コメント