こんにちは。本日はシングルトンについて記載しようと思います。
シングルトンとは
C++におけるシングルトンとは、インスタンス化されたオブジェクトが常に1つだけであることを保証し、かつそのオブジェクトにどこからでもアクセスできるようにするデザインパターンのことです。
実際に例文を見てみましょう。
class Test
{
public:
//作成したインスタンスを取得するゲッター
static Test& getInstance()
{
static Test instance;
return instance;
}
//コピーコンストラクタの禁止
Test(const Test&) = delete;
//コピー代入の禁止
Test& operator = (const Test&) = delete;
private:
//コンストラクタ
Test(){};
//デストラクタ
~Test(){};
};
上記の様にインスタンス化したオブジェクトが複数個生成出来ないように制限しつつ、他クラスからは専用のゲッターからアクセスできるようにするというのがシングルトンになります。
変数に使用でき、プログラム全体で実体が一つだけしか存在しないことを保証するstaticがありますが、シングルトンはそれを、
クラス単位に置き換え、publicに設置した。
というようなイメージがわかりやすいかもしれません。
使用例と注意点について
シングルトンは、スコア管理やマネージャといった、複製されてほしくないかつ、他オブジェクトから頻繁にアクセスされるオブジェクトによく使用される便利なデザインパターンなわけですが、いくつか注意点も存在します。
1:密結合になること。
密結合とは、他クラスやオブジェクトからのアクセスや関連性が高くなりすぎて、少ない変更点でも大きく影響がでたり、単体でのビルドが難しくなることです。
2:破棄するタイミング(ライフサイクル管理の難しさ)
シングルトンは便利な半面、他オブジェクトにも大きく影響をもたらす場合があります。
中でも生成と破棄のタイミングには注意が必要で、シングルトンが誤ったタイミングで破棄された結果、
他オブジェクトが破損したり、シングルトンへのアクセスが不可能になった結果、
処理が実行できなくなったりする。
といった事象になることもあり、1つ目の密結合共々、注意が必要です。
3:グローバル化による未知の状態の変化
シングルトンはどこからでもアクセスができる関係上、現在の状態がどの処理で、なぜ変化したのかを追跡するのに手間がかかってしまう場合があります。
この様に、便利ではあるものの、他オブジェクトに大きく影響を与える可能性があるシングルトンは、明確に一つしか存在しないオブジェクトに使用し、かつ乱用しすぎないのが望ましいと言えるでしょう。
以上
本記事は、業務や学習を通して理解した内容を、自分自身の整理も兼ねてまとめたものです。内容に改善点や補足などがありましたら、ご指摘いただけますと幸いです。