お久しぶりです。白々です。
先日エンジニアの先輩にデザインパターンをご存知でない!?という冷静なツッコミを頂き、その後結城浩さんが書かれた「Java言語で学ぶデザインパターン入門」を渡されたので勉強することにしました。
ただ、本を一読しても覚えられないので覚書として記事にしようと思いました。
今回で5回目です。
完走できるように頑張ります。
また、「Java言語で学ぶデザインパターン入門」には、サンプルプログラムも有りますが、著作権の都合上省かせて頂きます。御了承ください。
前回は、「Factory Methodパターン」に関しての記事を作成しました。
前回の記事は、以下です。
https://qiita.com/sirajirasajiki/items/3a779d3529fbc14af801
今回は、「Singletonパターン」に関して記載したいと思います。
また、「Singletonパターン」には、サンプルプログラムも有りますが、著作権の都合上省かせて頂きます。御了承ください。
#第5章 Singletonパターン-たった1つのインスタンス
「Java言語で学ぶデザインパターン入門」には、
インスタンスが1個しか存在しないことを保証するパターンをSingletonパターンと呼びます。
という記述がありました。
例えば、プログラム上で複数の種類の演算をするプログラムがあるとします。
それぞれの演算は、演算結果を次の演算に使う物とします。
これらの演算の結果を一挙に管理する演算管理クラスがあるとします。
このとき複数の演算クラスを作成できてしまう場合、インスタンス毎に演算結果が変わってしまいます。
なので、インスタンスは、1つにすることで本来求めていた演算結果を取得できます。
このように、プログラム上で、特定のクラスを継承したインスタンスが1つしか使いたくない時に使用します。
よくある例としては、機械を管理するパラメータのクラスが挙げられます。
例えば、機械の温度や、機械の動作状況などのパラメータを管理するインスタンスが同じ機器の中で複数あったら、機器はどのインスタンスを参照していいかわからなくなりますよね?また、インスタンス毎にパラメータが異なりどれが正しいかわからないかもしれないですよね?
このような時にこのSingletonパターンを使用します。
##Singletonを使った例
今回は、麻雀の点数管理をSingletonパターンで行うという状況を考えたいと思います。
麻雀の同じゲーム内で毎回インスタンスを立て直すと点数の最終結果がおかしいことになってしまうためSingletonパターンを使う物とします。
Mahjongというクラスの中には、プライベート変数で点数とインスタンスが管理されています。
また、Mahjongのインスタンスの取得、点数の取得及び、点数の計算をするメソッドが管理されている物とします。
このクラス図は、PlantUMLというもので記載しています。
私が、書いたPlantUMLのコードは以下のGitHubに記載がありますのでReadMeを読んでお使いください。
singleton.txtです。
https://github.com/sirajirasajiki/design_pattern_uml/tree/master/singleton
PlantUMLのインストール方法と使い方に関しては、後述のappendixに記載しています。
###クラス図を元にPythonで実装
以下に実装したコードを公開しています。Python 3.7で実装しました。
https://github.com/sirajirasajiki/design_pattern_python/tree/master/Singleton
##Singletonパターンを使う時の注意事項
- コンストラクタはprivateにしておく。
- 理由: 他のところで継承させないようにするため。
#まとめ
インスタンスをプログラム上で1つしか作成することができないSingletonパターンについて学びました。
#第5章感想
Singletonパターンを使うことで、複数インスタンスが作成されると、インスタンス同士が干渉してプログラムの挙動に影響が出るようなクラスでも、安心して使うことができるということが分かりました。
説明で使った例は、後日Pythonで実装しようと思います。
Pythonにて実装しました。
#最後に
何か間違っているところがあれば、ご指摘していただけると嬉しいです!
#appendix
##次回の記事
https://qiita.com/sirajirasajiki/items/02bde7075f8edd3570f1
##Python実装中に参考にした記事
https://qiita.com/ttsubo/items/c4af71ceba15b5b213f8
#変更履歴
- 説明の追加