MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

C++とPythonによるデザインパターン5: Singletonパターン

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ページにて公開しています。

cpp/Singleton.cpp at master · AtsushiSakai/cpp

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")

d.hatena.ne.jp

社会人二年目プログラマ: Python 2.xと3.xに両対応した継承するだけでSingletonになるクラスを書きました

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com