Python デザインパターン サンプルコード Flyweight
結城 浩「Java言語で学ぶデザインパターン入門」をPython化
Python3(3.11)で動くソースコード(.pyファイル .ipynbファイル)あります
「anaconda3」on .py「PyCharm」.ipynb「Jupyter Notebook」
(2023-11-19)Python3.11で動作確認済み
BigChar BigCharFactory BigString (print_) (getInstance, getBigChar) (print_)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import weakref class BigChar(object): # フォント(外部ファイル)を読み込み,それをprintする # コンストラクタ def __init__(self, charname): # 文字の名前(1文字) self.charname = charname buf = "" # ファイル読み込みの典型 with open("big" + self.charname + ".txt") as reader: for text in reader: buf= buf + text reader.close() # 大きな文字を表現する文字列('#' '.' '\n'の列) self.fontdata = buf # 大きな文字を表示する def print_(self): print(self.fontdata) class BigCharFactory(object): # すでに作ったBigCharのインスタンスを管理 # コンストラクタ def __new__(cls, *args, **kwargs): if not hasattr(cls, "__instance__"): cls.__instance__ = super(BigCharFactory, cls).\ __new__(cls, *args, **kwargs) return cls.__instance__ # このクラスのシングルトンを戻す(つくる) def __init__(self): self.pool = weakref.WeakValueDictionary() # インスタンスの保管場所 #self.pool = dict() # 普通の辞書でも動作は同じ # 唯一のインスタンスを得る def getInstance(): return BigCharFactory().__instance__ # このクラスのシングルトンを戻す # BigCharフォント毎のインスタンス生成(共有)(ダブりなし) def getBigChar(self, charname): obj = self.pool.get(charname) # 既存のオブジェクトを確認 if not obj: # 既存がないときは obj = BigChar(charname) # 新たにインスタンス化する self.pool[charname] = obj # 保管する #print(len(self.pool)) # debug フォント毎のインスタンスの数 return obj # フォント毎のシングルトンを戻す class BigString(object): # メインルーチンの指示通りに処理する def __init__(self, str): self.bigchars = dict() # printのためのオブジェクトの一時保管場所 factory = BigCharFactory.getInstance() # シングルトンを作るのではなくもらう for i in range(len(str)): # printのためのオブジェクトを一時保管 obj = factory.getBigChar(str[i]) self.bigchars[i] = obj def print_(self): for i in self.bigchars.keys(): # まとめてprintする self.bigchars[i].print_() def main(): if len(sys.argv) == 1: # コマンドライン引数がないときは注意喚起 print("Usage: python Flyweight.py digits") print("Example: python Flyweight.py 1212123") sys.exit() bs = BigString(sys.argv[1]) bs.print_() if __name__ == '__main__': main() """ 標準出力 (省略) 外部ファイルのフォントをそのままコマンドライン引数の指定とおりにprintします
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys class BigChar(object): # コンストラクタ def __init__(self, charname): # 文字の名前 self.charname = charname buf = "" # ファイル読み込みの典型 with open("big" + self.charname + ".txt") as reader: for text in reader: buf= buf + text reader.close() # 大きな文字を表現する文字列('#' '.' '\n'の列) self.fontdata = buf # 大きな文字を表示する def print_(self): print(self.fontdata) class BigCharFactory(object): pass class BigString(object): def __init__(self, str): self.bigchars = dict() for i in range(len(str)): obj = BigChar(str[i]) self.bigchars[i] = obj def print_(self): for i in self.bigchars.keys(): self.bigchars[i].print_() def main(): if len(sys.argv) == 1: print("Usage: python Flyweight.py digits") print("Example: python Flyweight.py 1212123") sys.exit() bs = BigString(sys.argv[1]) bs.print_() if __name__ == '__main__': main() 標準出力 (省略) 外部ファイルのフォントをそのままコマンドライン引数の指定とおりにprintします