[注。イベントのコレクションである「Calendar」と、カレンダー上の単一のイベントである「Event」の分離には十分注意してください。あなたの質問では、混乱が生じる可能性があるようです。]
Factoryのデザインパターンには多くのバリエーションがあります。
スタンドアロンの便利な関数(例:calendarMaker(data))
ターゲットクラス(Calendar)を構築する別のクラス(CalendarParserなど)。
クラスレベルのメソッド(Calendar.from_stringなど)メソッド。
これらには異なる目的があります。すべてPythonicで、質問は「どういう意味ですか?」です。と「何が変わる可能性がありますか?」意味がすべてです。変化は重要です。
便利な関数はPythonicです。Javaのような言語は、浮動関数を持つことはできません。孤独な関数をクラスでラップする必要があります。Pythonを使用すると、クラスのオーバーヘッドなしで孤独な関数を使用できます。関数は、コンストラクターに状態の変更や代替戦略、または以前のアクションのメモリがない場合に関連します。
時々、人々はクラスを定義し、次にクラスのインスタンスを作成し、状態と戦略およびその他の構成の通常のパラメーターを設定し、次にクラスの単一の関連するメソッドを呼び出す便利な関数を提供します。これにより、クラスのステートフル性とスタンドアロン関数の柔軟性の両方が得られます。
クラスレベルのメソッドパターンが使用されますが、制限があります。1つは、クラスレベルの変数に依存することを余儀なくされていることです。これらは混乱を招く可能性があるため、機能(ステートフルネスや代替戦略など)を追加する必要がある場合、静的メソッドとしての複雑なコンストラクターで問題が発生します。静的メソッドを拡張しないようにしてください。
2つ目は、クラスのメソッドと属性の残りの部分とはほぼ無関係です。この種はfrom_string
、Calendarオブジェクトの多くの代替エンコーディングの1つにすぎません。、、、from_xml
などfrom_JSON
がfrom_YAML
あります。これはどれも、カレンダーが何であるか、またはそれが何をするかとの関連性が最も低いものではありません。これらの方法はすべて、送信用にカレンダーをエンコードする方法に関するものです。
成熟したPythonライブラリに表示されるのは、ファクトリが作成するものとは別であるということです。エンコーディング(文字列、XML、JSON、YAMLとして)は、多かれ少なかれランダムに変更される可能性があります。ただし、本質的なことはめったに変更されません。
2つの懸念を分離します。エンコードと表現は、状態と動作からできるだけ離してください。