欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用簡單工廠模式來進行Python的設(shè)計模式編程

 更新時間:2016年03月01日 09:22:33   作者:BlueWish  
這篇文章主要介紹了使用簡單工廠模式來進行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)品對象的細節(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ù):負責(zé)具體產(chǎn)品對象的創(chuàng)建工作,是該模式的核心。當(dāng)場景比較復(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)的維護和擴展非常不利;

使用場景:
工廠類負責(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類圖如下:

20163192130485.gif (781×383)

相關(guān)文章

  • 淺談python函數(shù)之作用域(python3.5)

    淺談python函數(shù)之作用域(python3.5)

    下面小編就為大家?guī)硪黄獪\談python函數(shù)之作用域(python3.5)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • python人工智能tensorflow函數(shù)tensorboard使用方法

    python人工智能tensorflow函數(shù)tensorboard使用方法

    這篇文章主要為大家介紹了python人工智能tensorflow函數(shù)tensorboard使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python+PyQt5自制監(jiān)控小工具

    Python+PyQt5自制監(jiān)控小工具

    這篇文章主要為大家詳細介紹了如何通過使用python實現(xiàn)對計算機攝像頭的調(diào)用從而實現(xiàn)攝像監(jiān)控的功能,文中的示例代碼講解詳細,需要的可以參考一下
    2023-03-03
  • python使用多線程不斷刷新網(wǎng)頁的方法

    python使用多線程不斷刷新網(wǎng)頁的方法

    這篇文章主要介紹了python使用多線程不斷刷新網(wǎng)頁的方法,涉及Python多線程thread及time模塊操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • tensorflow 變長序列存儲實例

    tensorflow 變長序列存儲實例

    今天小編就為大家分享一篇tensorflow 變長序列存儲實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 在Pycharm中自動添加時間日期作者等信息的方法

    在Pycharm中自動添加時間日期作者等信息的方法

    今天小編就為大家分享一篇在Pycharm中自動添加時間日期作者等信息的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)類型

    python數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)類型

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類型,在?Python?以及其他所有面向?qū)ο缶幊陶Z言中,類都是對數(shù)據(jù)的構(gòu)成(狀態(tài))以及數(shù)據(jù)?能做什么(行為)的描述,下面我們就來你看看python數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類型商務(wù)詳細介紹,需要的小伙伴可以參考一下
    2021-12-12
  • Python 蟻群算法詳解

    Python 蟻群算法詳解

    這篇文章主要介紹了Python編程實現(xiàn)蟻群算法詳解,涉及螞蟻算法的簡介,主要原理及公式,以及Python中的實現(xiàn)代碼,具有一定參考價值,需要的朋友可以了解下
    2021-10-10
  • Python基本socket通信控制操作示例

    Python基本socket通信控制操作示例

    這篇文章主要介紹了Python基本socket通信控制操作,結(jié)合實例形式分析了Python socket通信服務(wù)器端與客戶端相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2019-01-01
  • Python一個簡單的通信程序(客戶端 服務(wù)器)

    Python一個簡單的通信程序(客戶端 服務(wù)器)

    今天小編就為大家分享一篇關(guān)于Python一個簡單的通信程序(客戶端 服務(wù)器),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論