工廠方法是設計模式中,創建設計模式的一種設計方式。
它允許接口或類創建對象,但讓子類決定要實例化哪個類或對象。
工廠方法提供了一種更好的方式,創建對象(不需要更改客戶端的代碼邏輯)。
看一個語言翻譯模型創建類的例子。
看一下不使用工廠模式的代碼:
class FrenchLocalizer:
""" 將信息翻譯為法語版本"""
def __init__(self):
self.translations = {
"car": "voiture", "bike": "bicyclette",}
def localize(self, msg):
"""change the message using translations"""
return self.translations.get(msg, msg)
class SpanishLocalizer:
"""將信息翻譯為西班牙語版本"""
def __init__(self):
self.translations = {
"car": "coche", "bike": "bicicleta",}
def localize(self, msg):
"""翻譯對應信息"""
return self.translations.get(msg, msg)
if __name__ == "__main__":
# 創建類實例
f = FrenchLocalizer()
s = SpanishLocalizer()
# 輸入信息
message = ["car", "bike"]
#輸出信息
for msg in message:
print(f.localize(msg))
print(s.localize(msg))
使用工廠模式的代碼:
class FrenchLocalizer:
""" 將信息翻譯為法語版本"""
def __init__(self):
self.translations = {
"car": "voiture", "bike": "bicyclette",}
def localize(self, msg):
"""翻譯對應信息"""
return self.translations.get(msg, msg)
class SpanishLocalizer:
""" 將信息翻譯為西班牙語版本"""
def __init__(self):
self.translations = {
"car": "coche", "bike": "bicicleta",}
def localize(self, msg):
"""翻譯對應信息"""
return self.translations.get(msg, msg)
#創建工廠模式
def Factory(language ="French"):
"""Factory Method"""
localizers = {
"French": FrenchLocalizer,
"Spanish": SpanishLocalizer,
}
return localizers[language]()
if __name__ == "__main__":
f = Factory("French")
s = Factory("Spanish")
message = ["car", "bike"]
for msg in message:
print(f.localize(msg))
print(s.localize(msg))
如果想要添加更多的語言版本模塊,只需要添加對應的類。
然後在工廠模式中添加對應類的字典索引,即可完成,這個過程不需要改變客戶端的代碼。
優點: