使用簡(jiǎn)單工廠模式來(lái)進(jìn)行Python的設(shè)計(jì)模式編程
計(jì)模式的目的是讓代碼易維護(hù)、易擴(kuò)展,不能為了模式而模式,因此一個(gè)簡(jiǎn)單的工具腳本是不需要用到任何模式的。
簡(jiǎn)單工廠模式又叫靜態(tài)工廠方法模式,工廠模式家族中最簡(jiǎn)單的一種模式。這個(gè)模式的基本工作方式: 通過一個(gè)工廠來(lái)決定創(chuàng)建哪種具體的產(chǎn)品實(shí)例。
下面是一個(gè)簡(jiǎn)單的工廠實(shí)例:
def create_animal(name): if name == 'dog': return Dog() elif name == 'cat': return Cat() animal = create_animal('dog') animal.eat('some food')
create_animal就是一個(gè)工廠,各種動(dòng)物就是產(chǎn)品,該工廠根據(jù)name來(lái)決定產(chǎn)出什么動(dòng)物產(chǎn)品。產(chǎn)品應(yīng)該具有一個(gè)基本特性,同一個(gè)工廠出產(chǎn)的所有產(chǎn)品都是一個(gè)系列,都具有相同的功能,比如動(dòng)物都吃食物。
簡(jiǎn)單工廠模式的好處是可以將產(chǎn)品對(duì)象的細(xì)節(jié)封裝在其實(shí)現(xiàn)類的內(nèi)部,改變一個(gè)產(chǎn)品對(duì)象具體實(shí)現(xiàn)不會(huì)影響其他產(chǎn)品??蓴U(kuò)展性強(qiáng),當(dāng)需要新增產(chǎn)品類型時(shí),只需要添加對(duì)應(yīng)的實(shí)現(xiàn)類,然后修改工廠,增加一個(gè)判斷分支即可。修改工廠函數(shù)帶來(lái)的風(fēng)險(xiǎn)比較低。
另外一個(gè)比較典型的適合簡(jiǎn)單工廠模式的例子是計(jì)算器,計(jì)算器需要支持各種計(jì)算操作,比如加、減、乘、除、平方、立方、平方根、階乘等等。那么這里的工廠就是要?jiǎng)?chuàng)建各種操作算法對(duì)象,每種操作算法對(duì)象都支持一個(gè)求值方法。
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)
前面提到,每個(gè)工廠生產(chǎn)的產(chǎn)品都是一個(gè)系列的,因此產(chǎn)品類通常會(huì)從同一個(gè)抽象基類派生,但不是必須的。
簡(jiǎn)單工廠模式的組成要素:
工廠函數(shù):負(fù)責(zé)具體產(chǎn)品對(duì)象的創(chuàng)建工作,是該模式的核心。當(dāng)場(chǎng)景比較復(fù)雜時(shí),可能需要用一個(gè)工廠類來(lái)負(fù)責(zé)產(chǎn)品的創(chuàng)建。
以及產(chǎn)品的抽象接口或抽象類、抽象所有產(chǎn)品的公共接口、具體產(chǎn)品類、抽象接口的具體實(shí)現(xiàn)類。
缺點(diǎn):
由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類中
它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了
當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時(shí)候,可能會(huì)出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實(shí)例的需求.這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類型的判斷交錯(cuò)在一起,很難避免模塊功能的蔓延,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利;
使用場(chǎng)景:
工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少;
客戶只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象(邏輯)不關(guān)心;
由于簡(jiǎn)單工廠很容易違反高內(nèi)聚責(zé)任分配原則,因此一般只在很簡(jiǎn)單的情況下應(yīng)用。
eg:采用簡(jiǎn)單工廠模式實(shí)現(xiàn)計(jì)算器
#encoding=utf-8 # #by panda #簡(jiǎn)單工廠模式 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)文章
淺談python函數(shù)之作用域(python3.5)
下面小編就為大家?guī)?lái)一篇淺談python函數(shù)之作用域(python3.5)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-10-10python人工智能tensorflow函數(shù)tensorboard使用方法
這篇文章主要為大家介紹了python人工智能tensorflow函數(shù)tensorboard使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python使用多線程不斷刷新網(wǎng)頁(yè)的方法
這篇文章主要介紹了python使用多線程不斷刷新網(wǎng)頁(yè)的方法,涉及Python多線程thread及time模塊操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03tensorflow 變長(zhǎng)序列存儲(chǔ)實(shí)例
今天小編就為大家分享一篇tensorflow 變長(zhǎng)序列存儲(chǔ)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-01-01在Pycharm中自動(dòng)添加時(shí)間日期作者等信息的方法
今天小編就為大家分享一篇在Pycharm中自動(dòng)添加時(shí)間日期作者等信息的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-01-01python數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)類型
這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類型,在?Python?以及其他所有面向?qū)ο缶幊陶Z(yǔ)言中,類都是對(duì)數(shù)據(jù)的構(gòu)成(狀態(tài))以及數(shù)據(jù)?能做什么(行為)的描述,下面我們就來(lái)你看看python數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類型商務(wù)詳細(xì)介紹,需要的小伙伴可以參考一下2021-12-12Python一個(gè)簡(jiǎn)單的通信程序(客戶端 服務(wù)器)
今天小編就為大家分享一篇關(guān)于Python一個(gè)簡(jiǎn)單的通信程序(客戶端 服務(wù)器),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03