mohuneko’s blog

かんばる駆け出しエンジニアのブログです

【Java】Singletonパターン【デザインパターン】

駆け出しエンジニアがデザインパターンをもくもく勉強します

 こんな本で勉強しています🌟

目次

Singletonパターンについて

Singletonパターンとは

サンプルプログラム

  • Singletonパターンを使って、Singletonのインスタンスを呼び出し、生成したインスタンスが同一かどうか確認する例を取り上げます
  • 各クラスの役割は以下のようになっています
名前 役割
Singleton インスタンスが1つしかないクラス
Main 動作テスト用クラス

f:id:mohuNeko:20201228135654p:plain

Singletonクラス

  • staticフィールド(クラス変数)としてsingletonを定義し、Singletonクラスのインスタンスで初期化します
  • コンストラクタをprivateにすることで、Singletonクラスの外でコンストラクタの呼び出しを禁止します
    • これで、インスタンスが1つしか生成されないことを保証することができます
  • 唯一のインスタンスを得るためのstasticメソッド(getInstance)で同じインスタンスを返します
public class Singleton {

    private static Singleton singleton = new Singleton();

    private Singleton() {                                 
        System.out.println("インスタンスを生成しました。");
    }

    public static Singleton getInstance() {
        return singleton;
    }
}

Mainクラスで動作確認

  • SingletonクラスのgetInstanceメソッドを使ってSingletonのインスタンスを得ています
  • ここで、obj1,obj2のように二回インスタンスを得ていますが、同一性の判定結果は、"obj1とobj2は同じインスタンスです" と表示されます
  • Singletonクラスのコンストラクタは一回しか呼ばれていないので、getInstanceしても同じインスタンスが帰されることになります!
public class Main {
    public static void main(String[] args) {
        System.out.println("Start.");
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();
        if (obj1 == obj2) {
            System.out.println("obj1とobj2は同じインスタンスです。");
        } else {
            System.out.println("obj1とobj2は同じインスタンスではありません。");
        }
        System.out.println("End.");
    }
}

Singletonパターンのメリット

  • 指定したクラスのインスタンス絶対に1つしか存在しないことを保証できます
  • インスタンスが1つしかないという保証があれば、この前提条件で開発できるので、思いがけないバグを防ぐことができます

今日のポイント

  • 生成するインスタンスの数を1つに制限するデザインパターンです
  • Singletonクラスのコンストラクタをprivateにすることで、Singletonクラスの外でコンストラクタの呼び出しを禁止します
    • これによって、インスタンスが1つしか生成されないことを保証することができます
  • Singletonクラス内の、唯一のインスタンスを得るためのstasticメソッド(getInstance)で同じインスタンスを返します
  • Singleton利用クラスから、Singletonクラスのインスタンスを複数回得る(getInstance)場合でも、 Singletonクラスのコンストラクタは一回しか呼ばれないので、同一のインスタンスが帰されることになります

 本日もお疲れ様です😊