這篇文章主要為大家詳細介紹了python版簡單工廠模式,具有一定的參考價值,有興趣的小夥伴們可以參考一下
什麼是簡單工廠模式
工廠模式有一個非常形象化的描述,建立物件的類別就如一個工廠,而需要被建立的物件就是一個個產品;在工廠中加工產品,使用產品的人,不用在乎產品是如何生產出來的。從軟體開發的角度來說,這樣就有效的降低了模組之間的耦合。
簡單工廠的作用是實例化對象,而不需要客戶了解這個物件屬於哪個特定的子類別。簡單工廠實例化的類別具有相同的介面或基底類,當子類別比較固定並不需要擴充時,可以使用簡單工廠。如資料庫生產工廠就是簡單工廠的一個應用
採用簡單工廠的優點是可以使用戶根據參數獲得對應的類實例,避免了直接實例化類,降低了耦合性;缺點是可實例化的類型在編譯期間已經被確定,如果增加新類型,則需要修改工廠,不符合OCP(開閉原則)的原則。簡單工廠需要知道所有要產生的類型,當子類別過多或子類別層次過多時不適合使用。
簡單工廠模式實作
下面考慮《大話設計模式》中的一個例子:
題目:用任意一種物件導向語言實現一個計算器控制台程式。要求輸入兩個數字和運算符號,得到結果。
題目分析:
程式應該要做到:(1)可維護;(2)可重複使用;(3)可擴充;(4)彈性好。
可維護:就是說程式碼一處更改,不能產生連鎖反應,不能影響其他地方。
可重複使用:盡量減少重複性程式碼。
可擴充:如果要擴充新的功能、新的業務,只需要增加新的類別就好了,不會對現有的類別和邏輯產生影響。插拔式的應用。
物件導向重點:
物件導向三大特性:封裝、繼承、多型。
透過封裝、繼承、多型把程式耦合降低。
業務邏輯和介面邏輯分開。
類別的結構圖:
#程式碼實作:
1. 首先,搞清楚業務中容易發生變化的部分。在這個應用中,要求計算兩個數的運算結果,那麼要進行什麼樣的運算,這就是一個容易改變的部分。例如,我們現在只想實現加減乘除運算,後期又想增加開根或求餘運算。那麼如何因應這種需求所帶來的改變。在程式設計的時候就應該考慮到程式的可維護性、可擴充性、程式碼的可重複使用性、彈性等等。
2. 例如現在這個運算器只有加減乘除四種運算。先建造一個Operation類,這個類別是各種具體運算類(加減乘除)的父類,主要是接受使用者輸入的數值。類別如下:
class Operation(): def __init__(self,NumberA=0,NumberB=0): self.NumberA = NumberA self.NumberB = NumberB def GetResult(self): pass
3. 然後是具體的運算類別:Add、Sub、Mul、p。他們都繼承了Operation類,並且重寫了getResult()方法。這樣就可以用多態性來降低不同業務邏輯的耦合度,修改任何一種運算類別都不會影響其他的運算類別。特定類別的程式碼如下:
class AddOp(Operation): def GetResult(self): return self.NumberB + self.NumberA class MinusOp(Operation): def GetResult(self): return self.NumberA - self.NumberB class MultiOp(Operation): def GetResult(self): return self.NumberA * self.NumberB class pideOp(Operation): def GetResult(self): try: return 1.0*self.NumberA / self.NumberB except ZeropisionError: raise
4. 那麼要如何讓計算機知道我要用哪一種運算呢?也就是說到底要實例化哪一個具體的運算類,Add? Sub? Mul? p?這時就應該考慮用 一個單獨的類別來做這個創造具體實例的過程,這個類別就是工廠類別。如下:
class OperationFatory(): def ChooseOperation(self,op): if op == '+': return AddOp() if op == '-': return MinusOp() if op == '*': return MultiOp() if op == '/': return pideOp()
5. 這樣,使用者只要輸入運算符,工廠類別就可以建立適當的實例,透過多態性,也就是傳回給父類的方式實現運算結果。客戶端程式碼如下:
if __name__ == '__main__': ch = '' while not ch=='q': NumberA = eval(raw_input('Please input number1: ')) op = str(raw_input('Please input the operation: ')) NumberB = eval(raw_input('Please input number2: ')) OPFactory = OperationFatory() OPType = OPFactory.ChooseOperation(op) OPType.NumberA = NumberA OPType.NumberB = NumberB print 'The result is:',OPType.GetResult() print '\n#-- input q to exit any key to continue' try: ch = str(raw_input()) except: ch = ''
完整版程式碼如下:
# -*-coding:UTF-8-*- from abc import ABCMeta,abstractmethod class Operation(): def __init__(self,NumberA=0,NumberB=0): self.NumberA = NumberA self.NumberB = NumberB def GetResult(self): pass class AddOp(Operation): def GetResult(self): return self.NumberB + self.NumberA class MinusOp(Operation): def GetResult(self): return self.NumberA - self.NumberB class MultiOp(Operation): def GetResult(self): return self.NumberA * self.NumberB class pideOp(Operation): def GetResult(self): try: return 1.0*self.NumberA / self.NumberB except ZeropisionError: raise class OperationFatory(): def ChooseOperation(self,op): if op == '+': return AddOp() if op == '-': return MinusOp() if op == '*': return MultiOp() if op == '/': return pideOp() if __name__ == '__main__': ch = '' while not ch=='q': NumberA = eval(raw_input('Please input number1: ')) op = str(raw_input('Please input the operation: ')) NumberB = eval(raw_input('Please input number2: ')) OPFactory = OperationFatory() OPType = OPFactory.ChooseOperation(op) OPType.NumberA = NumberA OPType.NumberB = NumberB print 'The result is:',OPType.GetResult() print '\n#-- input q to exit any key to continue' try: ch = str(raw_input()) except: ch = ''
以上是python版簡單工廠模式的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版