工廠方法模式Python版 雷鋒依然在人間

2021-06-29 00:20:58 字數 3111 閱讀 4124

工廠方法模式定義了乙個用於建立物件的介面,讓子類決定例項化哪乙個類,factory method使乙個雷的例項化延遲到其子類。

工廠方法模式的本質就是延遲到子類來選擇是實現。

**實現

class operationfactory:

operators = {}

operators['+'] = operationadd()

operators['-'] = operationsub()

operators['*'] = operationmul()

operators['/'] = operationdiv()

def getresult(self, ch):

if ch in operators:

op = operators[ch]

else:

op = undefoperator()

return op

if __name__ == "__main__":

oper = operationfactory()

oper.getresult("+")

oper.numa = 1

oper.numb = 2

print oper.getresult()

用工廠模式實現計算器的uml關係圖

class ifactory:

def createoperation(self):

pass

class addfactory(ifactory):

def createoperation(self):

add = operationadd()

return add

class subfactory(ifactory):

def createoperation(self):

sub = operationsub()

return sub

class mulfactory(ifactory):

def createoperation(self):

mul = operationmul()

return mul

class divfactory(ifactory):

def createoperation(self):

div = operationdiv()

return div

if __name__ == "__main__":

af = addfactory()

oper = add.createoperation()

oper.numa = 1

oper.numb = 2

print oper.getresult()

工廠模式實現時,客戶端需要決定例項化哪乙個工廠來實現運算類,選擇判斷的問題還是存在的,工廠方法把簡單工廠的內部邏輯移到了客戶端**進行。你想要加功能,本來是改工廠類的,現在是修改客戶端。

雷鋒工廠

class leifeng:

def sweep(self):

print "sweep"

def wash(self):

print "wash"

def buyrice(self):

print "buy rice"

class undergraduate(leifeng):

pass

class volunteer(leifeng):

pass

簡單工廠模式的**實現

class ******factory:

def createleifeng(self, type):

if type is "volunteer":

result = volunteer()

elif type is "undergraduate":

result = undergraduate()

return result

if __name__ == "__main__":

s = ******factory()

v = s.createleifeng("volunteer")

v.sweep()

v.wash()

工廠模式的**實現

class ifactory:

def createleifeng(self):

pass

class undergraduatefactory(ifactory):

def createleifeng(self):

return undergraduate()

class voluntee***ctory(ifactory):

def createleifeng(self):

return volunteer()

if __name__ == "__main__":

f = undergraduatefactory()

u = f.createleifeng()

u.sweep()

u.wash()

優點:可在不知具體實現的情況下程式設計

更容易擴充套件物件---只要在已有**中新加入乙個子類提供的新的工廠方法實現,然後在客戶端使用這個新的子類即可

連線平行的類層次----工廠方法除了創造產品物件外,在連線平行的類層次上也大顯身手

缺點:

具體產品物件和工廠方法的耦合性

工廠方法需要建立產品物件的,也就是需要選擇具體的產品物件,並建立他們的例項,因此具體產品物件和工廠方法是耦合的。

如果乙個類需要建立某個介面物件,但不知道具體的實現,這個時候可以選用工廠方法模式,把建立物件的工作延遲到子類中去實現。

如果乙個類本身是希望由它的子類來建立所需的物件的時候,應該使用工廠方法模式。

工廠方法模式和簡單工廠模式,以及抽象工廠模式

工廠方法模式和模板方法模式

工廠方法模式的子類專注於建立產品物件,而模板方法模式的子類專注於為固定演算法骨架提供某些差異化步驟的實現。

工廠方法模式 雷鋒在人間

工廠方法模式 對比兩個模式 乙個簡單地加減乘除類 結構圖 只要輸入運算符號,工廠就可以例項化出乙個合適的物件,通過多型,返回父類的方式實現了計算器的結果。如果需要更改加法運算,直接更改operationadd就可以。如果增加其他運算,只要增加相應的運運算元類就可以了。如果需要修改運算類工廠,只需要在...

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...

工廠方法模式 工廠方法模式 二

工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...