使用簡單工廠模式來進行Python的設(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)品對象的細(xì)節(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)品類通常會從同一個抽象基類派生,但不是必須的。
簡單工廠模式的組成要素:
工廠函數(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)的維護和擴展非常不利;
使用場景:
工廠類負(fù)責(zé)創(chuàng)建的對象比較少;
客戶只知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象(邏輯)不關(guān)心;
由于簡單工廠很容易違反高內(nèi)聚責(zé)任分配原則,因此一般只在很簡單的情況下應(yīng)用。
eg:采用簡單工廠模式實現(xiàn)計算器
#encoding=utf-8
#
#by panda
#簡單工廠模式
class OperateBase():
result = 0;
def GetResult(self):
return self.result;
class OperationAdd(OperateBase):
def __init__(self, NumA, NumB):
self.result = NumA + NumB;
def GetResult(self):
return self.result;
class OperationSub(OperateBase):
def __init__(self, NumA, NumB):
self.result = NumA - NumB;
def GetResult(self):
return self.result;
class OperationMult(OperateBase):
def __init__(self, NumA, NumB):
self.result = NumA * NumB;
def GetResult(self):
return self.result;
class OperationDiv(OperateBase):
def __init__(self, NumA, NumB):
self.result = NumA / NumB;
def GetResult(self):
return self.result;
class OperationFactory():
@staticmethod
def createOperate(operate, NumA, NumB):
optList = {
'+':OperationAdd,
'-':OperationSub,
'*':OperationMult,
'/':OperationDiv,
}
oper = OperateBase()
if(optList.has_key(operate)):
oper = optList[operate](NumA, NumB);
return oper
def clientUI():
opt = raw_input("please input a operation(+-*/): ");
NumA = raw_input("please input the first number: ");
NumB = raw_input("please input the second number: ");
oper = OperationFactory.createOperate(opt, float(NumA), float(NumB))
print "Restlt: ", oper.GetResult()
return
if __name__ == '__main__':
clientUI();
UML類圖如下:

相關(guān)文章
Linux下將Python的Django項目部署到Apache服務(wù)器
這篇文章主要介紹了Python的Django項目部署到Apache服務(wù)器上的要點總結(jié),文中針對的是wsgi連接方式,需要的朋友可以參考下2015-12-12
使用Fabric自動化部署Django項目的實現(xiàn)
這篇文章主要介紹了使用Fabric自動化部署Django項目的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
python如何派生內(nèi)置不可變類型并修改實例化行為
這篇文章主要為大家詳細(xì)介紹了python如何派生內(nèi)置不可變類型并修改實例化行為,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
Python 數(shù)據(jù)結(jié)構(gòu)之十大經(jīng)典排序算法一文通關(guān)
排序算法可以分為內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存2021-10-10
14個用Python實現(xiàn)的Excel常用操作總結(jié)
自從學(xué)了Python后就逼迫自己不用Excel,所有操作用Python實現(xiàn)。目的是鞏固Python,與增強數(shù)據(jù)處理能力。本文為大家總結(jié)了14個用Python實現(xiàn)的Excel常用操作,需要的可以參考一下2022-06-06

