staticとSingletonパターンの違いと使い分け

java

オブジェクト指向プログラミングのプログラミング手法で、「singleton(シングルトン)」と呼ばれる手法があります。
この手法は、プロジェクト内で共通的に使われるインスタンスを1つだけ予め作成し、外部のクラスにはそのインスタンスを使用させる、という手法です。

この手法を学んだ時に「インスタンスを1つにすれば良いなら、クラス変数やメソッドをstaticにするだけで良いのでは?」と思ったので、試しにテストコードを書いてみました。
単純なstaticでは使用者側で好きにインスタンスを作成できる(実態としては1つ)のですが、singletonとしてインスタンスを作成すれば使用者側でのインスタンス作成を防ぎ、明示的にインスタンスを1つにできることを確認しました。

【テストコード】

・StaticMemory.java

・SingletoneMemory.java

・MemoryTestMain.java

【実行結果】


いかがでしたでしょうか。

「singleton」は、GoFの23個のデザインパターンの内の1つに数えられる手法です。
デザインパターンはオブジェクト指向プログラミングのプログラミング手法をまとめたものであり、効率的なプログラミングを行う上で有効ですので、これからも紹介していくと思います。

では、また次回!

コメント

  1. yuki より:

    すみません通りすがりでたまたま見たのでコメントしますが、
    staticしかないメソッドのクラスの方にも
    privateのコンストラクタを作れば 「使用者側で好きにインスタンスを作成できる」を防げるのではないでしょうか?

    このままだと
    「単なるstaticとsingletoneパターンの違い」 という記事としては主張が弱いような気がします。

    class StaticMemory {
    private StaticMemory() {
    }

    private static int num = 0;

    public static void setNum(int arg) {
    num = arg;
    }

    public static int getNum() {
    return num;
    }

    }

  2. 伊東 輝 より:

    コメントありがとうございます。
    コードを実際に書いて確認しましたが、確かにご指摘通りでした。
     
    そもそも、Singletonの書き方に倣ってgetInstanceメソッドを用意したとしても、
    SingletoneMemory.getInstance()

    SingletoneMemory
    で代替できますね。
    (インスタンスが一つしか生成されないので)
     
    なぜSingletonパターンでgetInstanceメソッドを用意することが推奨されるのか、分からなくなってきました。
    (単なる流儀なのか、私が何か勘違いしているのか…)
    私の不勉強で申し訳ないのですが、また気付いたことがあれば書かせていただきます。

タイトルとURLをコピーしました