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

JavaでSingletonパターン

More than 1 year has passed since last update.

はじめに

GoFのデザインパターンを紹介している『増補改訂版 Java言語で学ぶデザインパターン入門』を読んで、学んだ内容についてまとめます。

Singletonパターン

Singletonとは

日本語に訳すとトランプの1枚札のことで、全体の集合の中で1つしか存在しないものを意味します。
このことからシステム全体でインスタンスが1つしか存在しないことを保証するパターンのことをSingletonパターンと言います。

登場人物

Singletonパターンで使用するのは以下のクラス図に登場するクラスです。
と言ってもSingletonクラスの1つしかありません。
image.png

具体例

具体例として、singletonクラスと実行クラスをもとに説明します。

実装クラス

  • Singletonクラス
Singleton.java
package singleton;

public class Singleton {
    // 1.staticフィールド(クラス変数)としてsingletonを定義
    private static Singleton singleton = new Singleton();

    // 2.privateなコンストラクタ
    private Singleton() {
        System.out.println("インスタンスの生成に成功しました");
    }

    // 3.singletonインスタンスの返却
    public static Singleton getInstance() {
        return singleton;
    }
}

ポイントは以下の3点です。
1.privateなクラス変数としてsingletonが定義されている。
2.コンストラクタがprivateになっており、他のクラスから呼び出すことができない。(newできない)
3.singletonインスタンスを返却するgetInstance()メソッドを定義している。

補足の説明を行います。
まず、外部のクラスからpublicなgetInstance()メソッドが呼ばれます。
その際に初めて呼ばれる場合は、Singletonクラスの初期化が行われ、その時に一度だけSingletonクラスのインスタンスが生成されます。
以降、getInstance()メソッドが呼ばれる場合は既に生成したSingletonクラスのインスタンスが返されます。
コンストラクタ内ではインスタンスの生成が成功したことが分かるように出力を行っていますが、通常は不要です。

実行クラス

  • Mainクラス
    getInstance()メソッドを2回呼び出し、同じインスタンスを取得していることを確認します。
Main.java
package singleton;

public class Main {
    public static void main(String[] args) {
        System.out.println("***実行クラス開始***");
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();
        if (obj1 == obj2) {
            System.out.println("obj1 is obj2");
        } else {
            System.out.println("obj1 is not obj2");
        }
        System.out.println("***実行クラス終了***");
    }
}

実行結果

Main.javaを実行した結果は以下になります。
obj1 is obj2が出力されており、同一のインスタンスを取得できていることが確認できます。

実行結果
***実行クラス開始***
インスタンスの生成に成功しました
obj1 is obj2
***実行クラス終了***

メリット

Singletonパターンを利用することで、システム全体でインスタンスが1つしか存在しないことが保証できます。
このようにすることで、複数のインスタンスが絡み合い、思いがけないバグが発生してしまうことを未然に防ぐことができます。

まとめ

インスタンスが1つしか存在しないことを保証するSingletonパターンに関して学びました。
以下でサンプルコードをアップしていますのでよろしければ参考にどうぞ。

また、他のデザインパターンに関しては以下でまとめていますので、こちらも参考にどうぞ。

参考文献

Why not register and get more from Qiita?
  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
No 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
ユーザーは見つかりませんでした