前提
作ったインスタンスにクラス名+インスタンスの数を辞書のキーとして与えて、
test_1.print_name('FirstProduct1')
のようにクラス名+作成番号で作った辞書のキーでオブジェクトを呼び出せるようにするのが目的です。
呼び出し元(Main)にカウンターを持たせてしまうと、ファクトリーメソッドで作った回数(FirstProduct, SeconProduct)を数えてしまうために、それぞれのクラスを個別にカウントできません。
呼び出し側にそれぞれのファクトリー用のカウンターを持たせてしまうと、呼び出し側がファクトリーの知識を持ってしまうのでファクトリーを増やす際に呼び出し元(Main)の改変が必要になってしまいます。
該当のソースコードでは、呼び出される側にクラス変数を持たせていますが、新たに呼び出し元のインスタンス(Main)を作るとそれぞれのクラス(FirstProduct, SecondProduct)のカウンターがリセットされません。
そもそもクラス設計やデザインパターンの使い方が間違っているなどの指摘でもかまいません。わかりにくい質問かもしれませんが、よろしくお願いいたします。
実現したいこと
インスタンスの数を、呼び出し元に依存せず数えたい。
または、ファクトリーメソッドで作ったインスタンスにクラス名+作成数の名前をつけて辞書のキーにしたい。
該当のソースコード
python
1from abc import ABCMeta, abstractmethod 2import pprint 3 4class Main(): 5 def __init__(self): 6 self.obj = [] # productのオブジェクトリスト 7 self.obj_name = [] # productの名前リスト 8 self.obj_dict = {} # productの辞書 9 10 def create_obj(self, factory_type): 11 product = factory_type.create_product() # productのインスタンス作成 12 object_name = product.__class__.__name__ # productのクラス名 13 num_product = product.num # productの作成回数 14 15 self.obj.append(product) # オブジェクトリストの追加 16 self.obj_name.append(object_name + str(num_product)) # 名前(クラス名+作成番号)リストの追加 17 self.obj_dict = dict(zip(self.obj_name, self.obj)) # クラス名とオブジェクトのバインド 18 19 def print_name(self, product): 20 self.obj_dict[product].print_name() 21 22class Factory(metaclass=ABCMeta): # factory 23 @abstractmethod 24 def create_product(self): 25 pass 26 27class FirstFactory(Factory): # concrete factory 28 def create_product(self): 29 return FirstProduct() 30 31class SecondFactory(Factory): # concrete factory 32 def create_product(self): 33 return SecondProduct() 34 35class Product(metaclass=ABCMeta): #product 36 @abstractmethod 37 def print_name(self): 38 pass 39 40class FirstProduct(Product): # concrete product 41 num = 0 # インスタンス作成回数 42 def __init__(self): 43 FirstProduct.num += 1 44 45 def print_name(self): 46 print('First Product ' + str(FirstProduct.num)) 47 48class SecondProduct(Product): # concrete product 49 num = 0 # インスタンス作成回数 50 def __init__(self): 51 SecondProduct.num += 1 52 53 def print_name(self): 54 print('Second Product ' + str(FirstProduct.num)) 55 56if __name__ == '__main__': 57 test_1 = Main() # 一つ目のMainオブジェクト 58 test_1.create_obj(FirstFactory()) 59 test_1.create_obj(SecondFactory()) 60 61 test_2 = Main() # 二つ目のMainオブジェクト 62 test_2.create_obj(FirstFactory()) 63 test_2.create_obj(SecondFactory()) 64 65 pprint.pprint(test_1.obj_dict) 66 print() 67 pprint.pprint(test_2.obj_dict) 68 print() 69 70 test_1.print_name('FirstProduct1') 71 test_1.print_name('SecondProduct1') 72 test_2.print_name('FirstProduct2') 73 test_2.print_name('SecondProduct2') 74 75 76 # 辞書のキーをMainのインスタンス(test_1,test_2)ごとに1から始めたい 77 78 # 結果を 79 #First Product 1 80 #Second Product 1 81 #First Product 1 82 #Second Product 1 83 #にしたい
補足情報(FW/ツールのバージョンなど)
python 3.8.10
回答1件
あなたの回答
tips
プレビュー