アマチュアSEの勉強ブログ

アマチュアSEと一緒に勉強しましょ

デザインパターン(GoF)/Singleton

本記事ではデザインパターンSingleton(読:シングルトン)」について勉強していきましょう!



【ゴール】

「Singletonって〇〇のことで、〇〇な時に利用するんだ!」といえるようになること!

 

さて、ポイントはこの2つ!

この2つのポイントについて解説していきます!

デザインパターンとは?

JavaC++C#などのオブジェクト指向言語よく使われる設計をパターン化したものデザインパターンといいます。

本記事のタイトルにもある「GoF」というのは、このデザインパターンを作成した4人組のことで、彼らは全23パターンに分けています。

GoFの全23パターン

  • Template Method
  • Singleton
  • Adapter
  • Factory Method
  • Facade
  • Iterator
  • Abstract Factory
  • Bridge
  • Builder
  • Chain of Responsibility
  • Command
  • Composite
  • Decorator
  • Flyweight
  • Interpreter
  • Mediator
  • Mement(Snapshot)
  • Observer
  • Prototype
  • Proxy
  • State
  • Strategy
  • Visitor

本日はこの中から、「Singleton」をご紹介します。

Singletonとは?

Singletonとは、「一枚札」を意味する英単語です。
Singletonパターンは、GoFが作成したデザインパターン23個のうちの1つで、
生成するインスタンスの数を1つに制限する設計パターンです。

  • 指定したクラスのインスタンスが1つしか存在しないことを保証する
  • インスタンスが1個しか存在しないことをプログラム上で表現したい

このような場合にSingletonパターンを用いてインスタンスを生成します。
インスタンスの状態を保持したかったり、クラス間で共通のメソッド・プロパティにアクセスしたい場合に使われることが多いですね。

Singletonのクラス図

f:id:amateurSE:20210903112923p:plain
Singletonクラス図

✓ポイント

  • 同じ型のインスタンスprivate なクラス変数(static変数)として定義されている。
  • コンストラクの可視性が private である。
  • 同じ型のインスタンスを返す getInstance() がクラス関数(staticメソッド)として定義されている。

Singletonを使ってみる

まずは基本的なSingletonパターンのサンプルプログラムを見ていきましょう。

final class Singleton {
        //ポイント①
        private static Singleton instance = new Singleton();
        //ポイント②
        private Singleton() {}
        //ポイント③
        public static Singleton getInstance() {
                return instance;
        }
}
ポイント①「同じ型のprivate なクラス変数」

クラス変数(static変数)にしているので、プログラム実行直後に初期化、つまり、インスタンスが生成されます。
staticなので、初期化(インスタンス生成)は1度しか行われません。

ポイント②「コンストラクタの可視性がprivate」

コンストラクタの修飾子がprivateになっています。こうすることで、外部からインスタンスを生成することが出来ません。
(他のクラスで、「Singleton instance = new Singleton();」と書けないということ!
コンストラクタはnewした時に実行されるメソッドなので!)

ポイント③「同じ型のインスタンスを返すクラス関数」

コンストラクタがprivateになっているので、このクラス関数(staticメソッド)を使って、インスタンスを生成します。
(逆に、このメソッドに「static」が付いていないと、メソッドを呼び出すことができないのです。staticメソッドは、インスタンスを生成しなくても呼び出すことができるメソッドです。他のクラスからインスタンス生成せずに呼び出すには、staticメソッドにします。)

Singletonパターンのインスタンス生成

Singletonパターンのインスタンス生成する際は、このように行います。

// staticメソッドを呼び出す方法「クラス名.メソッド名」
Singleton single= Singleton .getInstance();

まとめ

今回は、デザインパターンである「Singleton」について勉強しました。いかがでしたでしょうか?

「Singleton」について聞かれたときは、下記を言えるようになりましょう!

Singletonは、GoFが作成したデザインパターンのうちの一つで
生成するインスタンスの数を1つに制限する設計パターンのこと

 
ご覧いただきありがとうございました!