[備註。將「日曆」分爲一系列事件要非常謹慎,而「事件」 - 日曆上的單個事件。在你的問題,似乎可能會有一些混淆。]
工廠設計模式有很多變化。
一個獨立的便利功能(例如,calendarMaker(數據))
一個單獨的類(例如,CalendarParser)它建立您的目標類(日曆)。
一個類級方法(例如Calendar.from_string)方法。
這些有不同的目的。所有是Pythonic,問題是「你是什麼意思是?」和「什麼可能改變?」意義就是一切;改變很重要。
便利功能是Pythonic。像Java這樣的語言不能有自由浮動的功能;你必須在課堂中包裝一個孤獨的功能。 Python允許你在沒有類的開銷的情況下擁有一個孤獨的函數。當您的構造函數沒有狀態更改或備用策略或任何先前操作的內存時,函數是相關的。
有時候人們會定義一個類,然後提供一個便利函數,它使得類的實例,爲狀態和策略以及任何其他配置設置常用參數,然後調用該類的單個相關方法。這給你帶來了課堂的有狀態和獨立功能的靈活性。
使用了類級方法模式,但它有侷限性。其一,它不得不依賴於課堂級別的變量。由於這些可能會造成混淆,因此當您需要添加功能(如有狀態或替代策略)時,作爲靜態方法的複雜構造函數會遇到問題。請確保您永遠不會擴展靜態方法。
二,它或多或少與其他類方法和屬性無關。這種from_string
只是Calendar對象的許多備選編碼之一。你可能有一個from_xml
,from_JSON
,from_YAML
等等。這與日曆的內容或它的功能沒有任何關係。這些方法都是關於日曆如何編碼進行傳輸的。
您會在成熟的Python庫中看到的是,工廠與創建的東西是分開的。編碼(如字符串,XML,JSON,YAML)受到很多或多或少的隨機變化。然而,基本的東西很少會改變。
分開這兩個問題。保持編碼和表示儘可能遠離狀態和行爲。
的Pythonista說,「muuuuu」 – 2008-09-22 16:07:42