Help us understand the problem. What is going on with this article?

JavaのSingletonデザインパターン

More than 3 years have passed since last update.

Oracle Certified Java Programmer, Gold SE 7 の資格試験学習メモ

Singletonデザインパターンとは

「そのクラスのインスタンスは常に1つしか存在しない」状態を作り出すパターン。
システム内で1つ作るだけで済むインスタンスや、1つだけしか作りたくないインスタンスがある場合に使用する。

サンプル

SingletonSample.java
public class SingletonSample {
    private static SingletonSample singleton = new SingletonSample();

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

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

インスタンス用の変数はprivateでフィールドとして用意しておく。
privateコンストラクタを記述する。
インスタンス取得用のgetterメソッドを用意しておく。

シングルトンのデザインパターンはGang of Fourがまとめたものとのことで、もともとは下のような実装だったそう

OldSingletonSample.java
public class OldSingletonSample {
    private static OldSingletonSample singleton;

    private OldSingletonSample(){
        singleton = null;
    }

    public static OldSingletonSample getInstance(){
        if(singleton == null){
            singleton = new OldSingletonSample();
        }
        return singleton;
    }
}

ただ、上の実装だと複数のスレッドが動いている場合に1つのスレッドがif文内を入っている時に別のスレッドが入れるようになってしまっている。
それを避けるために一番上のサンプルコードの実装になった模様。

Singletonデザインパターンのポイント

  • 「たった1つだけのインスタンスを作成する」というより、「そのインスタンスが1つしか存在しないことを保証する」ためにSingletonデザインパターンを使用する。
  • インスタンスが1つしかなければ、他に影響するインスタンスがないため、「インスタンスは1つ」の条件下でプログラムが書ける。制御しやすい。
  • 1つだけインスタンスを作成するだけといっても、クラスメソッドを使用しているので、多用は避けた方がいいらしい

使いどころ

シングルトンの使いどころは、フラグ管理とかになるかも。ちょっと事例を調べてみよう。

実装時に気をつけるポイント

  • 必ずプライベートコンストラクタを記述しておく。これを書いておかないと、デフォルトコンストラクタが呼ばれるため、インスタンスが複数作成可能となってしまう。
  • インスタンスを取得するgetterメソッドを必ず用意する。インスタンスの作成はそのシングルトンのクラス内でしか行わないため、メソッドを用意しないと使用できない。

参考資料

学習に当たり以下の資料を参考としています。
増補改訂版 Java言語で学ぶデザインパターン入門
クラスのインスタンスを1つに保つ(Singletonパターン)

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away