設(shè)計模式的目的是讓代碼易維護陕悬、易擴展,不能為了模式而模式按傅,因此一個簡單的工具腳本是不需要用到任何模式的捉超。
簡單工廠模式又叫靜態(tài)工廠方法模式,工廠模式家族中最簡單的一種模式唯绍。這個模式的基本工作方式: 通過一個工廠來決定創(chuàng)建哪種具體的產(chǎn)品實例拼岳。
下面是一個簡單的工廠實例:
def create_animal(name):
if name == 'dog':
return Dog()
elif name == 'cat':
return Cat()
animal = create_animal('dog')
animal.eat('some food')
create_animal
就是一個工廠,各種動物就是產(chǎn)品况芒,該工廠根據(jù)name來決定產(chǎn)出什么動物產(chǎn)品惜纸。產(chǎn)品應(yīng)該具有一個基本特性,同一個工廠出產(chǎn)的所有產(chǎn)品都是一個系列绝骚,都具有相同的功能耐版,比如動物都吃食物。
簡單工廠模式的好處是可以將產(chǎn)品對象的細節(jié)封裝在其實現(xiàn)類的內(nèi)部压汪,改變一個產(chǎn)品對象具體實現(xiàn)不會影響其他產(chǎn)品粪牲。可擴展性強止剖,當(dāng)需要新增產(chǎn)品類型時腺阳,只需要添加對應(yīng)的實現(xiàn)類,然后修改工廠穿香,增加一個判斷分支即可亭引。修改工廠函數(shù)帶來的風(fēng)險比較低。
另外一個比較典型的適合簡單工廠模式的例子是計算器扔水,計算器需要支持各種計算操作痛侍,比如加、減、乘主届、除赵哲、平方、立方君丁、平方根枫夺、階乘等等。那么這里的工廠就是要創(chuàng)建各種操作算法對象绘闷,每種操作算法對象都支持一個求值方法橡庞。
def create_operator(op):
if op == '+':
return AddOperation()
elif op == '-':
return SubOperation()
elif op == '*':
return MulOperation()
elif op == '/':
return DivOperation()
op = create_operator('+')
op.Calc(1, 2)
前面提到,每個工廠生產(chǎn)的產(chǎn)品都是一個系列的印蔗,因此產(chǎn)品類通常會從同一個抽象基類派生扒最,但不是必須的。
簡單工廠模式的組成要素
1.工廠函數(shù)
負責(zé)具體產(chǎn)品對象的創(chuàng)建工作华嘹,是該模式的核心吧趣。當(dāng)場景比較復(fù)雜時,可能需要用一個工廠類來負責(zé)產(chǎn)品的創(chuàng)建耙厚。
2.產(chǎn)品的抽象接口或抽象類
抽象所有產(chǎn)品的公共接口
3.具體產(chǎn)品類
抽象接口的具體實現(xiàn)類
缺點
1.由于工廠類集中了所有實例的創(chuàng)建邏輯强挫,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個工廠類中
2.它所能創(chuàng)建的類只能是事先考慮到的薛躬,如果需要添加新的類俯渤,則就需要改變工廠類了
3.當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時候,可能會出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實例的需求.這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯在一起型宝,很難避免模塊功能的蔓延八匠,對系統(tǒng)的維護和擴展非常不利;
使用場景
1.工廠類負責(zé)創(chuàng)建的對象比較少诡曙;
2.客戶只知道傳入工廠類的參數(shù)臀叙,對于如何創(chuàng)建對象(邏輯)不關(guān)心;
3.由于簡單工廠很容易違反高內(nèi)聚責(zé)任分配原則价卤,因此一般只在很簡單的情況下應(yīng)用。