設(shè)計模式的目的是讓代碼易維護(hù)艰争、易擴(kuò)展,不能為了模式而模式猜旬,因此一個簡單的工具腳本是不需要用到任何模式的脆栋。
簡單工廠模式又叫靜態(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)品對象的細(xì)節(jié)封裝在其實現(xiàn)類的內(nèi)部倦蚪,改變一個產(chǎn)品對象具體實現(xiàn)不會影響其他產(chǎn)品希坚。可擴(kuò)展性強陵且,當(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)品類通常會從同一個抽象基類派生逢防,但不是必須的。
簡單工廠模式的組成要素
-
工廠函數(shù)
負(fù)責(zé)具體產(chǎn)品對象的創(chuàng)建工作蒲讯,是該模式的核心忘朝。當(dāng)場景比較復(fù)雜時,可能需要用一個工廠類來負(fù)責(zé)產(chǎn)品的創(chuàng)建判帮。 -
產(chǎn)品的抽象接口或抽象類
抽象所有產(chǎn)品的公共接口 -
具體產(chǎn)品類
抽象接口的具體實現(xiàn)類
缺點
- 由于工廠類集中了所有實例的創(chuàng)建邏輯局嘁,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個工廠類中
- 它所能創(chuàng)建的類只能是事先考慮到的晦墙,如果需要添加新的類悦昵,則就需要改變工廠類了
- 當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時候,可能會出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實例的需求.這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯在一起晌畅,很難避免模塊功能的蔓延但指,對系統(tǒng)的維護(hù)和擴(kuò)展非常不利;
使用場景
- 工廠類負(fù)責(zé)創(chuàng)建的對象比較少抗楔;
- 客戶只知道傳入工廠類的參數(shù)棋凳,對于如何創(chuàng)建對象(邏輯)不關(guān)心;
- 由于簡單工廠很容易違反高內(nèi)聚責(zé)任分配原則连躏,因此一般只在很簡單的情況下應(yīng)用剩岳。
原文地址:http://www.isware.cn/python-design-pattern/01-simple-factory/