デザインパターン・Singleton(シングルトン)パターンの実装

デザインパターン・Singleton(シングルトン)パターンの実装をご紹介します。
Singletonパターンを使用することで、ネットワークやシステム内の状態などを常に監視することができます。


Singletonパターンとは

Singleton(シングルトン)パターンとは、
インスタンスの存在を唯一に保証するためのデザインパターンです。
Singletonクラスのインスタンスは何度生成されても1つしか存在せず、プロセスが終わる(製品の電源が切られる)まで存在し続けます。

用途・どんな時に使えるの?

主に以下の目的で使用します。

  • システムの状態を常に監視
  • インスタンスの管理
  • リクエストの窓口(Facadeパターンで使用。この記事で使っています。)

これらの目的を果たすために、Singletonクラスを使用します。
また他のデザインパターンであるFlyweightパターンやFacadeパターンでも使用されています。

クラス図



Singletonのクラス設計図です。
ex_singletonクラスがSingletonクラスです。

privateメンバに自身のポインタとスレッドセーフを考慮してmutexを持ちます。publicメソッドには生成するためのget_instance()メソッドを定義します。

使用者はget_instance()メソッドをコールしてSingletonクラスを使用します。

※ExSingletonはただのmain関数であり、使用者です。

実装の解説

C++で実装したサンプルコードを解説します。
このサンプルコードでは3つのスレッドからSingletonクラスをコールし、Constructor(コンストラクタ)が一度だけ呼ばれていることを確認します。

まずget_instance()内がSingletonパターンのロジックになります。
スレッドセーフを考慮してダブルチェックロッキング(Double-Checked Locking)を採用しています。これはmutex(ミューテックス)ガードを入れることで排他制御を行い、複数のスレッドからアクセスしても問題が発生しないようにすることです。その後、ex_singletonをヒープ領域へ生成し、そのポインタをprivateで持っていたex_singletonへ設定します。
最後にそのインスタンスの実体を参照渡しでreturnします。

ロジックからもわかるように、get_instance()が何回呼ばれても一度生成したex_singletonのインスタンスを返すようになっています。

ヘッダーファイルでは唯一の存在を保証するために必要なメンバをstaticで宣言します。
コンストラクタとデストラクタはprivateで宣言します、御作法といったところでしょうか。

■ ex_singleton.cpp

■ ex_singleton.h

Singletonクラスを使用する場合は下記のようになります。
使用者は生成したインスタンスのアドレスを取得することでインスタンスのメソッドを使用することができます。

■ ExSingleton.cpp

サンプルコード

Visual C++ 2017で作成したサンプルコードをGitHubで公開しています。
GitHub – ExSingleton

実行結果(一部省略)は以下の通りです。

[ 26] Start.
[ 16] work_process thread_id[26972]
[ 13] Constructor
[ 39] Singleton class start
[ 16] work_process thread_id[26976]
[ 39] Singleton class start
[ 16] work_process thread_id[26980]
[ 39] Singleton class start
[ 38] Terminate.

実行結果より、Constructor(コンストラクタ)が一度だけ呼ばれていることが確認できます。またデストラクタは呼ばれていないため、唯一の存在が保証されていることを確認できます。

参考

以下のサイトを参考にさせていただきました。
Qiita – デザインパターン「Singleton」

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/7/29 21:38時点)

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*

Translate »