2007/06/14

お題3:シングルトン

お題3:シングルトン (Python Workshop the Edge 2007)

お題3:シングルトン

Pythonでシングルトンを作れ。

まぁ、シングルトンってなに?っていうところから始めなければならないのよね。
Singleton パターン - Wikipedia
Singletonコンストラクタが一つしか無いことを保証するらしい。 で、作ってみた。
#!/usr/bin/env python2.5
# -*- coding: utf-8 -*-

class Singleton:
   __instance = None;
   def getInstance(self):
      if (self.__class__.__instance == None):
         self.__class__.__instance = self;
         return self.__class__.__instance;
      else:
         return self.__class__.__instance;

class Memo(Singleton):
   __text = "";
   def setText(self, text):
      self.__class__.__text = text;

   def getText(self):
      return self.__class__.__text;

class Memo2(Singleton):
   __text = "";
   def setText(self, text):
      self.__class__.__text = text;

   def getText(self):
      return self.__class__.__text;

if (__name__ == "__main__"):
   #以下、ひたすら動作確認
   mem1 = Memo().getInstance();
   mem2 = Memo().getInstance();
   mem3 = Memo();
   
   print mem1;
   print mem2;
   print mem3;
   
   mem1.setText("momonga");
   
   print mem1.getText();
   print mem2.getText();
   print mem3.getText();
   
   mem3.setText("musasabi");
   
   print mem1.getText();
   print mem2.getText();
   print mem3.getText();
   
   mem2.setText("hattori");
   
   print mem1.getText();
   print mem2.getText();
   print mem3.getText();
   
   tex1 = Memo2().getInstance();
   tex2 = Memo2().getInstance();
   tex3 = Memo2().getInstance();
   
   print tex1;
   print tex2;
   print tex3;
   
   tex1.setText("text2");

   print tex1.getText();
   print tex2.getText();
   print tex3.getText();

   print mem1.getText();
   print mem2.getText();
   print mem3.getText();
…新しいインスタンスの作成自体は防げていない…という出来損ない?
pythonではデータ、メソッドの隠蔽が出来ないらしいのでお手上げ。
newClass = NewClass().getInstance();でインスタンスを取得。
最初に作成されたインスタンスをクラス変数として保存し、すべてのメソッドはそこからテータを取ってくる。
結局これで良いのかどうかもよくわからない。

0 件のコメント: