国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-01-04 17:41:16
字體:
來源:轉載
供稿:網(wǎng)友
這篇文章主要介紹了使用簡單工廠模式來進行Python的設計模式編程的方法,需要的朋友可以參考下
 

計模式的目的是讓代碼易維護、易擴展,不能為了模式而模式,因此一個簡單的工具腳本是不需要用到任何模式的。

簡單工廠模式又叫靜態(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)品應該具有一個基本特性,同一個工廠出產(chǎn)的所有產(chǎn)品都是一個系列,都具有相同的功能,比如動物都吃食物。

簡單工廠模式的好處是可以將產(chǎn)品對象的細節(jié)封裝在其實現(xiàn)類的內部,改變一個產(chǎn)品對象具體實現(xiàn)不會影響其他產(chǎn)品??蓴U展性強,當需要新增產(chǎn)品類型時,只需要添加對應的實現(xiàn)類,然后修改工廠,增加一個判斷分支即可。修改工廠函數(shù)帶來的風險比較低。

另外一個比較典型的適合簡單工廠模式的例子是計算器,計算器需要支持各種計算操作,比如加、減、乘、除、平方、立方、平方根、階乘等等。那么這里的工廠就是要創(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ù):負責具體產(chǎn)品對象的創(chuàng)建工作,是該模式的核心。當場景比較復雜時,可能需要用一個工廠類來負責產(chǎn)品的創(chuàng)建。
以及產(chǎn)品的抽象接口或抽象類、抽象所有產(chǎn)品的公共接口、具體產(chǎn)品類、抽象接口的具體實現(xiàn)類。

缺點:
由于工廠類集中了所有實例的創(chuàng)建邏輯,違反了高內聚責任分配原則,將全部創(chuàng)建邏輯集中到了一個工廠類中
它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了
當系統(tǒng)中的具體產(chǎn)品類不斷增多時候,可能會出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實例的需求.這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統(tǒng)的維護和擴展非常不利;

使用場景:
工廠類負責創(chuàng)建的對象比較少;
客戶只知道傳入工廠類的參數(shù),對于如何創(chuà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類圖如下:

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 徐州市| 扶余县| 宁晋县| 兴仁县| 蓝田县| 肥西县| 永登县| 莱芜市| 维西| 盘山县| 潍坊市| 龙泉市| 遵化市| 桑植县| 依安县| 星子县| 砚山县| 宜阳县| 阜城县| 南部县| 永济市| 南汇区| 揭阳市| 堆龙德庆县| 和政县| 湟中县| 云龙县| 松潘县| 前郭尔| 五家渠市| 扶余县| 皋兰县| 公安县| 嘉善县| 定襄县| 铜鼓县| 怀集县| 广西| 基隆市| 肇东市| 康平县|