概念
簡(jiǎn)單工廠模式的最大優(yōu)點(diǎn)在于工廠類中包含了必要的邏輯判斷,根據(jù)客戶端的選擇條件動(dòng)態(tài)實(shí)例化相關(guān)的類橙依,對(duì)于客戶端來說,去除了與具體產(chǎn)品的依賴硕旗。
也就是說窗骑,如果需要增加一個(gè)運(yùn)算,那么除了增加一個(gè)類以外漆枚,還要修改工廠创译。這樣就違背了開放-封閉原則。
工廠方法模式墙基,定義一個(gè)用于創(chuàng)建對(duì)象的接口软族,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類残制。
根據(jù)依賴倒轉(zhuǎn)原則立砸,把工廠類抽象出一個(gè)接口,這個(gè)接口只有一個(gè)方法初茶,就是創(chuàng)建抽象產(chǎn)品的工廠方法仰禽。然后,所有的要生產(chǎn)具體類的工廠,就去實(shí)現(xiàn)這個(gè)接口吐葵,這樣规揪,一個(gè)簡(jiǎn)單工廠模式的工廠類,變成了一個(gè)工廠抽象接口和多個(gè)具體生成對(duì)象的工廠温峭。于是 猛铅,要增加一個(gè)功能的時(shí)候,就不需要更改原有的工廠類了凤藏,只需要增加此功能的運(yùn)算類和相應(yīng)的工廠類就可以了奸忽。
工廠方法模式實(shí)現(xiàn)時(shí),客戶端需要決定實(shí)例化哪一個(gè)工廠來實(shí)現(xiàn)運(yùn)算類揖庄,選擇判斷的問題還是存在的栗菜,也就是說,工廠方法把簡(jiǎn)單工廠的內(nèi)部邏輯判斷轉(zhuǎn)移到客戶端代碼來進(jìn)行蹄梢。要增加功能疙筹,原來改工廠類的,現(xiàn)在是修改客戶端禁炒。
雷鋒工廠
薛磊風(fēng)作為一個(gè)大學(xué)生而咆,以學(xué)雷鋒做好事的名義去幫助老人做事,如何設(shè)計(jì)幕袱?
# /usr/bin/python
# coding=utf-8
class LeiFeng:
def sweep(self):
print "掃地"
def wash(self):
print "洗碗"
def buyrice(self):
print "買米"
class undergraduate(LeiFeng):
pass
student1 = undergraduate()
student1.buyrice()
student1.sweep()
student1.wash()
增加一個(gè)“社區(qū)志愿者”類
# /usr/bin/python
# coding=utf-8
class LeiFeng:
def sweep(self):
print "掃地"
def wash(self):
print "洗碗"
def buyrice(self):
print "買米"
class undergraduate(LeiFeng):
pass
class volunteer(LeiFeng):
pass
class simpleFactory:
@staticmethod
def createleifeng(type):
switcher = {
"學(xué)雷鋒的大學(xué)生": undergraduate(),
"社區(qū)志愿者": volunteer()
}
return switcher[type]
studentA = simpleFactory.createleifeng("學(xué)雷鋒的大學(xué)生")
studentA.buyrice()
studentB = simpleFactory.createleifeng("學(xué)雷鋒的大學(xué)生")
studentA.sweep()
studentC = simpleFactory.createleifeng("學(xué)雷鋒的大學(xué)生")
studentC.wash()
需要在任何實(shí)例化的時(shí)候?qū)懗鲞@個(gè)工廠的代碼暴备,有過多重復(fù)。
# /usr/bin/python
# coding=utf-8
class leifeng:
def sweep(self):
print "掃地"
def wash(self):
print "洗碗"
def buyrice(self):
print "買米"
class undergraduate(leifeng):
pass
class volunteer(leifeng):
pass
class IFactory:
def createleifeng(self):
pass
class undergraduateFactory(IFactory):
def createleifeng(self):
return undergraduate()
class volunteerFactory(IFactory):
def createleifeng(self):
return volunteer()
factory = undergraduateFactory()
student = factory.createleifeng()
student.sweep()
student.buyrice()
student.wash()