Python實現工廠模式
阿新 • • 發佈:2018-11-03
作者:黎智煊,叩丁狼高階講師。本文為原創文章,轉載請註明出處。
首先,什麼是工廠模式?
工廠模式是一個在軟體開發中用來建立物件的設計模式。
工廠模式包涵一個超類
。這個超類提供一個抽象化的介面來建立一個特定型別的物件,而不是決定哪個物件可以被建立。
為了實現此方法,需要建立一個工廠類
建立並返回。
當程式執行輸入一個“型別”
的時候,需要創建於此相應的物件。這就用到了工廠模式。在如此情形中,實現程式碼基於工廠模式,可以達到可擴充套件,可維護的程式碼
。當增加一個新的型別,不在需要修改已存在的類,只增加
能夠產生新型別的子類
我們有一個基類Person
,包涵獲取名字,性別的方法 。有兩個子類male 和female,可以打招呼。還有一個工廠類。
工廠類有一個方法名getPerson有兩個輸入引數,名字和性別。
使用者使用工廠類,通過呼叫getPerson方法。
在程式執行期間,使用者傳遞性別給工廠,工廠建立一個與性別有關的物件。因此工廠類在執行期,決定了哪個物件應該被建立。
class Person: def __init__(self): self.name = None self.gender = None def getName(self): return self.name def getGender(self): return self.gender class Male(Person): def __init__(self, name): print "Hello Mr." + name class Female(Person): def __init__(self, name): print "Hello Miss." + name class Factory: def getPerson(self, name, gender): if gender == ‘M': return Male(name) if gender == 'F': return Female(name) if __name__ == '__main__': factory = Factory() person = factory.getPerson("Chetan", "M")
繼續舉其他例子:
多種品牌的汽車4S店
當買車時,有很多種品牌可以選擇,比如北京現代、別克、凱迪拉克、特斯拉等,那麼此時該怎樣進行設計呢?
定義一個基本的4S店類
class CarStore(object): #僅僅是定義了有這個方法,並沒有實現,具體功能,這個需要在子類中實現 def createCar(self, typeName): pass def order(self, typeName): # 讓工廠根據型別,生產一輛汽車 self.car = self.createCar(typeName) self.car.move() self.car.stop() # 定義一個北京現代4S店類 class XiandaiCarStore(CarStore): def createCar(self, typeName): self.carFactory = CarFactory() return self.carFactory.createCar(typeName) # 定義伊蘭特車類 class YilanteCar(object): # 定義車的方法 def move(self): print("---車在移動---") def stop(self): print("---停車---") # 定義索納塔車類 class SuonataCar(object): # 定義車的方法 def move(self): print("---車在移動---") def stop(self): print("---停車---") # 定義一個生產汽車的工廠,讓其根據具體得訂單生產車 class CarFactory(object): def createCar(self,typeName): self.typeName = typeName if self.typeName == "伊蘭特": self.car = YilanteCar() elif self.typeName == "索納塔": self.car = SuonataCar() return self.car suonata = XiandaiCarStore() suonata.order("索納塔")
最後來看看工廠方法模式的定義
-
定義了一個建立物件的介面(可以理解為函式),但由子類決定要例項化的類是哪一個,工廠方法模式讓類的例項化推遲到子類,抽象的CarStore提供了一個建立物件的方法createCar,也叫作工廠方法。
-
子類真正實現這個createCar方法創建出具體產品。 建立者類不需要直到實際建立的產品是哪一個,選擇了使用了哪個子類,自然也就決定了實際建立的產品是什麼。