IThaiのブログ

IT関連の話題やタイに関する様々なことを書いていきます。

デザインパターンを学び直す - Singletonパターン

私が経験した現場では、あまりデザインパターンを見ることも、
考えることも少ないのですが、Javaプログラマとしては必須の知識なので、
デザインパターンを学び直します。

まずは有名なGoFのデザインパターンから。

今回は簡単なSingletonパターンをみてみます。

Singletonパターンはインスタンスをただ一つしか作らせたくないときに用いられます。

まずは、通常のパターンです。

public class Normal{
    
    private String name;

    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }

    public static void main(String[] args){
        Normal instance = new Normal();
        instance.setName("aaa");
        System.out.println(instance.getName());
        instance = new Normal();
        System.out.println(instance.getName());
    }
}

Normalクラスのインスタンスを作成した後、aaaという名前をつけ、名前を取得し、標準出力します。 その後にまた別のインスタンスを作成して、そのまま標準出力します。

実行結果
aaa
null

当然、1つ目の標準出力では、aaaという名前をつけられたインスタンスの名前を取得しているので、"aaa"と出力されます。また、2つ目の標準出力では、別のインスタンスを作成しているので、インスタンスの名前を取得しても、"null"と出力されます。

Singletonパターン

public class Singleton{
    
    private String name;
    
    private static Singleton registerNote = new Singleton();
    private Singleton(){} //デフォルトコンストラクタを潰す
    public static Singleton getInstance(){ //publicでインスタンスを返すメソッド
        return registerNote;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    
    public static void main(String[] args){
        //Singleton instance = new Singleton(); //デフォルトコンストラクタは潰されているので、newできない
        Singleton instance = Singleton.getInstance();
        instance.setName("aaa");
        System.out.println(instance.getName());
        instance = Singleton.getInstance();
        System.out.println(instance.getName());
    }
}
実行結果
aaa
aaa

先程と同じようにSingletonクラスのインスタンスを作成した後、
aaaという名前をつけ、名前を取得し、標準出力します。

実行結果としては、
当然、1つ目の標準出力では、aaaという名前をつけられたインスタンスの名前を取得しているので、"aaa"と出力されます。 また、2つ目の標準出力では、別のインスタンスは作成できず、インスタンスの名前を取得しても、1つ目と同じインスタンスの名前を参照することになるため"aaa"と出力されます。

これがSingletonパターンですが、使用例としては、 ロギングライブラリ(java.util.logging)やスレッドプール(java.util.concurrent.Executors)などがあります。

次回はStrategyパターンを見てみます。

Java言語で学ぶリファクタリング入門

Java言語で学ぶリファクタリング入門