Singletonパターン
Singletonパターンは、一つのアプリに対して、
あるクラスのオブジェクトを一つだけ作って欲しい場合に
使用するデザインパターンです。
クラスの中で一つのオブジェクトを持ち、
そのポインタを返す関数だけで、
オブジェクトを作成できるようにします。
コンストラクタや、コピーコンストラクタなどをPrivateにすることで、
コンパイル時に意図的にオブジェクトを作成させないようにできます。
C++ではstaticを使用して、
クラスの唯一のオブジェクトをクラス間共有することができ、
static関数を使用することにより、インスタンス無しで
インスタンス生成関数を利用することができるようになります。
C++によるサンプルコード
/** * @file: Singleton.cpp * * @brief: Singleton model of the Design pattern. * * @author: Atsushi Sakai * * @copyright (c): 2014 Atsushi Sakai * * @license : GPL Software License Agreement **/ #include <iostream> using namespace std; /** * @brief シングルトンなクラス(インスタンスを一つしか許さない) */ class Singleton{ public: /** * @brief インスタンスのポインタを取得する関数 */ static Singleton* GetInstance(void){ static Singleton singleton; return &singleton; } /** * @brief Numを設定する関数 */ void SetNum(int num){num_=num;} /** * @brief Numを取得する関数 */ int GetNum(void){return num_;} private: Singleton(){}//コンストラクタをprivateに置く Singleton(const Singleton& r){} //コピーコンストラクタも private に置く Singleton &operator=(const Singleton& r); //代入演算子も private に置く int num_;//オブジェクト確認用変数 }; int main(void){ cout<<"Singleton Pattern Sample Start!!"<<endl; //シングルトンインスタンスの取得 Singleton *singleton1=Singleton::GetInstance(); Singleton *singleton2=Singleton::GetInstance(); //値をセット singleton1->SetNum(10); //値の確認 cout<<"Singleton1:"<<singleton1->GetNum()<<endl; cout<<"Singleton2:"<<singleton2->GetNum()<<endl; return 0; }
下記のGitHubページにて公開しています。
PythonによるSingletonパターン
Pythonの場合は、オブジェクトを生成される際に呼ばれる
__new__関数をオーバライドし、
クラスオブジェクトが生成されてない場合に
オブジェクトを生成し、
それ以外の時は、最初に生成したオブジェクトを使うようにします。
Pythonにおけるサンプルコード
class Singleton(object): u""" Singleton """ __instance=None def __new__(cls,*args,**keys): if cls.__instance is None: cls.__instance=object.__new__(cls) cls.__instance.InitClass() return cls.__instance def InitClass(self): print("Init")
社会人二年目プログラマ: Python 2.xと3.xに両対応した継承するだけでSingletonになるクラスを書きました
参考資料
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com
myenigma.hatenablog.com