TanukiEngineerの1歩ずつ進もうよ!

まだまだ駆け出しエンジニアの学習メモ

デザインパターン:Singleton(シングルトン)パターン

Singleパターンの概要

  • インスタンスが1個しか存在しないことを保証するパターンをSingletonパターンと呼びます。

    • 指定したクラスのインスタンスが絶対に1個しか存在しないことを保証したい

    • インスタンスが1個しか存在しないことをプログラム上で表現したい

    • 例えば、コンピュータそのものを表現したクラス、現在のシステム設定を表現したクラス、ウインドウシステムを表現したクラスなどである

  • singletonとは、要素を1個しかもたない集合のことです

サンプルプログラム

表 クラス一覧

名前 説明
Singleton インスタンスが1つしか存在しないクラス
Main 動作テスト用のクラス

クラス図
f:id:TanukiEngineer:20210203055636p:plain


以下、各クラスの説明

Singletonクラス

  • インスタンスは1つしか作られません。
  • staticフィールド(クラス変数)としてsingletonを定義し、Singletonクラスのインスタンスで初期化します。
  • この初期化はSingletonクラスのロード時に一度だけ行われます。
  • コンストラクタはprivateにします。privateにする理由は以下のとおりです。
  • Singletonクラスの唯一のインスタンスを得るための static メソッドを定義します。ここでは、getInstance()という名前にしています。

Singleton.java

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {
        System.out.println("インスタンスを生成しました");
    }
    public static Singleton getInstance() {
        return singleton;
    }
}

Mainクラス

  • SingletonクラスのgetInstanceメソッドを呼び出しSingletonのインスタンスを取得します。
  • インスタンスが1つしか存在しないことを確認するため、getInstanceメソッドを2回呼び出しそれぞれobj1とobj2に代入し、obj1 == obj2でテストしています。

Main.java

public class Main {
    public static void main(String[] args) {
        System.out.println("Singletonプログラム開始");
        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("Singletonプログラム終了");
    }
}

実行結果:

Singletonプログラム開始
コンストラクタ:インスタンスを生成しました
obj1とobj2は同じインスタンスです
Singletonプログラム終了
  • プログラムが開始後、getInstanceメソッドを呼び出したときに Singletonクラスが初期化され static フィールドの初期化が行われ、唯一のインスタンスが生成されます。
  • 実行結果から、Singletonパターンの目的どおりインスタンスが1つしか存在しないことを保証できることが確認できました。

参考:詳しくは、以下の書籍を参照してください(練習問題もあります)。

増補改訂版Java言語で学ぶデザインパターン入門 | 結城 浩 |本 | 通販 | Amazon