日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单工厂模式

發布時間:2025/3/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单工厂模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
資料來源《大話設計模式》

1. 面試受挫

# 面試受挫 class Program(object):def __init__(self):passdef getResult(self):a = int(input("請輸入數字:\n>>> "))c = input("請輸入運算符:\n>>> ")b = int(input("請輸入另一個數字:\n>>> "))if c == "+":r = a + belif c == "-":r = a - belif c == "*":r = a * belse:r = a / bprint("運算結果為: ", r)

2. 初學者代碼毛病

  • string A; string B; string C這樣的命名是非常不規范的.
  • 判斷分支,這樣的寫法,意味著每個條件都要做判斷,等于計算機做了三次無用功.
  • 如果除數時,客服端輸入了0怎么辦,如果用戶輸入的是字符符號而不是數字怎么辦.

3. 代碼規范

class Program(object):def __init__(self):passdef getResult(self):a = int(input("請輸入數字:\n>>> "))c = input("請輸入運算符:\n>>> ")b = int(input("請輸入另一個數字:\n>>> "))if c == "+":r = a + belif c == "-":r = a - belif c == "*":r = a * belse:if b == 0:print("除數不能為0,請重新輸入")exit(0)else:r = a / bprint("運算結果為: ", r)

4. 面向對象編程

碰到問題就直覺地用計算機能夠理解的邏輯來描述和表達待解決的問題及求解過程.這其實是計算機的方式思考,這并沒有錯.但是這樣的思維卻使得我們的程序只為滿足實現當前的需求,程序不容易維護,不容易擴展,更不容易復用.從而達不到高質量代碼的要求.

5. 活字印刷,面向對象

  • 在這之前,要修改,必須重刻;要加字,必須重刻;要重新排列,必須重刻;印完該書,此版毫無價值.
  • 活字印刷:
    1) 要改,只需要改要改之字,可維護
    2) 重復使用,可復用
    3) 加字,另刻字加入即可,可擴展
    4) 豎排橫排,將活字移動即可,靈活性好.

6. 面向對象的好處

要改需求,更改最初的想法的事件,才逐漸明白當中的道理.
開始通過封裝,繼承,多態把程序的耦合性降低,用設計模式使得程序更加的靈活,容易修改,并且易于復用.

7. 復制與復用

復制,因為當你的代碼中重復的代碼多到一定程度,維護的時候,可能就是一場災難.越大的系統,這種方式帶來的問題越嚴重,編程有一原則,就是用盡可能的辦法去避免重復.想想看,有哪些是和控制臺無關,而哪些只是和計算器有關的.

8. 業務的封裝

讓業務邏輯與界面邏輯分開,讓它們之間的耦合度下降.

Operation運算類:

class Operation(object):@staticmethoddef getResult(numberA, op, numberB): # 這里就單個函數更簡單,但是還是用類來實現,if op == "+":return numberA + numberBelif op == "-":return numberA - numberBelif op == "*":return numberA * numberBelse:return numberA / numberB

客服端代碼:

if __name__ == "__main__":numberA = int(input("請輸入數字:\n>>> "))op = input("請輸入運算符:\n>>> ") # 這里略過對操作符的numberB = int(input("請輸入另一個數字:\n>>> "))try:print(Operation(numberA, op, number B)except ZeroDivisionError:return "除數不能為0"

9. 緊耦合vs.松耦合

A: 如何做到很靈活的可修改和可擴展?比如說增加一個平方根運算,如何改?
B: 只需要修改Operation類就可以了,在switch中加一個分支就行了.
A: 問題是你要加一個平方根運算,卻需要讓加減乘除的運算都得來參與編譯.
B: 我應該把加減乘除等運算分離,修改其中一個不影響另外的幾個,增加運算算法也不影響其他代碼?
A: 如何用繼承和多態,你應該有感覺了.

Operation運算類:

import abcclass Operation(abc.ABC):def __init__(self, numberA, numberB):self._numberA = numberAself._numberB = numberB@abc.abstractmethoddef getResult(self):raise NotImplementedErrorclass OperationAdd(Operation):def __init__(self, numberA, numberB):super(OperationAdd, self).__init__(numberA, numberB)def getResult(self):return self._numberA + self._numberBclass OperationSub(Operation):def __init__(self, numberA, numberB):super(OperationSub, self).__init__(numberA, numberB)def getResult(self):return self._numberA - self._numberBclass OperationMul(Operation):def __init__(self, numberA, numberB):super(OperationMul, self).__init__(numberA, numberB)def getResult(self):return self._numberB * self._numberAclass OperationDiv(Operation):def __init__(self, numberA, numberB):super(OperationDiv, self).__init__(numberA, numberB)def getResult(self):try:return self._numberA / self._numberBexcept ZeroDivisionError:return "除數不能為0"

B: 我如何讓計算器知道我希望用哪一個算法呢?

10. 簡單工廠模式

A: 你現在的問題就是如何去實例化對象的問題,到底要實例化誰,將來會不會增加實例化的對象,比如增加開根運算,這是很容易變化的地方,應該考慮用一個單獨的類做這個創造實例的過程,這就是工廠.

簡單運算工廠類:

class OperationFactory(object):_select = {"+": OperationAdd,"-": OperationSub,"*": OperationMul,"/": OperationDiv}@staticmethoddef createOperation(op):return OperationFactory._select.get(op)

客服端代碼:

if __name__ == "__main__":numberA = int(input("請輸入數字:\n>>> "))op = input("請輸入運算符:\n>>> ") # 這里略過對操作符的判斷numberB = int(input("請輸入另一個數字:\n>>> "))opCls = OperationFactory.createOperation(op)operation = opCls(numberA, numberB)print(operation.getResult())

A: 如果有一天我們需要更改加法運算,我們只需要改哪里?
B: 改OperationAdd就可以了.
A: 增加運算?
B: 只要增加相應的運算子類就可以了.還要去修改運算類工廠,在switch中增加分支.

這幾個類的結構圖:

11. UML類圖


編程是一門技術,更是一門藝術,不能只滿足于寫完代碼運行結果正確就完事了,時常考慮如何讓代碼更加簡練,更加容易維護,容易擴展和復用,只有這樣才能真正提高.

總結

以上是生活随笔為你收集整理的简单工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。