デザインパターンの一つ、Singletonパターンを勉強してみました。
今回はQtとC++を使って、不思議なGUIアプリを作ってみました。

Singletonパターンはよく出てくるので覚えておいた方が良い
Singletonパターンとは
インスタンスを一つしか作れないパターンのことをいいます。
インスタンスが一つしか作れないことを保証したい場合に、このパターンを使うようです。
具体的にどういうふうに使うのかがいまいちわかってないですが・・・
クラス図

クラス図はこんな感じです。シンプルですね。特徴としては以下3つがあります。
- 同じ型のインスタンスが private なクラス変数として定義されている。
- コンストラクタの可視性が private である。
- 同じ型のインスタンスを返す
getInstance()
がクラス関数として定義されている。
コンストラクタとインスタンスがprivateであることがポイントですね。
作成したアプリ
Singletonパターンで作成したアプリで、インスタンスが常に唯一になっていることが可視化できるアプリを作りました。
たしかにインスタンスが一個しか作られないのがわかりました。
コードと実行結果

こちらのアプリでは、ボタンを押すと地球を生成するアプリを作りました。
地球は世界に一つしかない・・ので、シングルトンで作ってみるのがいいかなと思いました。謎ですね。
こちらでは、ボタンを押すたびに、Earthクラスを生成するのですが、シングルトンパターンなので、インスタンスは1つしか生成されません。
インスタンスのメモリアドレスも表示していますが、同じインスタンスだというのがわかります。
コードを分解
では、各クラスの説明をしていきます。
mainwindow.h / mainwindow.cpp
ここでは、UI部分の実装やロジックを入れています。
earth.h / earth.cpp
Earthクラスはシングルトンパターンで実装されています。
クラス図で説明したそれぞれの特徴と照らし合わせてみます。
- 同じ型のインスタンスが private なクラス変数として定義されている。
- staticなローカル変数を宣言しています。
- コンストラクタの可視性が private である。
- コンストラクタ, デストラクタをprivateで宣言します。こうすることで、インスタンスの生成ができなくなります。
- 一方でコピーもできないようにしなくてはいけないので、コピーコンストラクタと代入演算子はdefault/deleteを使用しています。(コンストラクタがprivateだから、そもそもコピーってできないんじゃないの?と思ってるんですけど、コピーできないようにしておく、っていう配慮が必要なのかな・・・)
- 同じ型のインスタンスを返す
getInstance()
がクラス関数として定義されている。- Earthクラスを使いたい場合、こちらを呼び出すことで、1で定義したインスタンスを呼び出すことができます。
どういう時に使うのか?
あまり使い道が考えられなかったのですが、アプリの中でインスタンスを1個しか生成したくない場合に使うといいみたいですね。
具体的な事象が思い浮かばないので、なかなかしっくりきませんが。
ですが、このテクニックは覚えておくと良いかなと思うので、忘れないようにしておきたいと思います。
まとめ
Singletonパターンのアプリを作成してまとめてみました。
使いどきは、いまいちしっくりきていませんが、このテクニックは覚えておいて損はないと思うので、頭の隅に入れておきたいと思います。
他のデザインパターンについてはこちらをご覧ください。
参考サイト

にほんブログ村に参加しております!よろしければクリックお願いします 🙂

にほんブログ村
コメント