python與設計模式
Ⅰ python設計模式 - 代理模式
"""
代理模式(Proxy):為某個對象提供一種代理以控制對這個對象的訪問。
注意:代理模式和策略模式的類圖很相近,實現方法也是一樣的,但是應用場景很不一樣,體現了不同的思想。
策略模式中同一外部對象訪問上下文對象的操作一樣,但是裡面的策略對象不同。
代理模式中不同的外部對象訪問代理對象的操作一樣,但是裡面的真實對象是一樣的。
代理模式在訪問對象時引入一定程度的間接性,因為這種間接性,可以附加多種用途。
應用場景:
1、遠程代理。為一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在於不同地址空間的事實。
2、虛擬代理。當要創建耗時很長的對象時,可以使用虛擬代理。虛擬代理完成的工作為新建真實對象,並在新建的過程中給出提示。比如在網頁載入圖片的過程中,虛擬代理可以用一個圖片框暫時替代真實的圖片。
3、安全代理。用於控制真實對象訪問是的許可權。
4、智能指引。當調用真實的對象時,代理處理另外一些事情,比如計算真實對象的引用次數、是否鎖定等等。
"""
import time
class SalesManager:
def talk(self):
print("銷售經理准備談")
class Proxy:
def __init__(self):
self.busy = 'No'
self.sales = None
def talk(self):
print("代理檢查銷售經理的可訪問性")
if self.busy == 'No':
self.sales = SalesManager()
time.sleep(0.1)
self.sales.talk()
else:
time.sleep(0.1)
print("銷售經理正忙")
class NoTalkProxy(Proxy):
def talk(self):
print("代理檢查銷售經理的可訪問性")
time.sleep(0.1)
print("該銷售經理也不會跟你說話不論他/她是否正忙")
if __name__ == '__main__':
p = Proxy()
p.talk()
p.busy = 'Yes'
p.talk()
p = NoTalkProxy()
p.talk()
p.busy = 'Yes'
p.talk()
Ⅱ Python設計模式:簡單工廠模式
簡單工廠模式又稱之為靜態工廠方法,屬於創建型模式。
在簡單工廠模式中,可以根據傳遞的參數不同,返回不同類的實例。簡單工廠模式定義了一個類,這個類專門用於創建其他類的實例,這些被創建的類都有一個共同的父類。
簡單工廠模式:通過介面創建對象,且不會暴露對象創建邏輯
在設計模式中主要用於抽象對象的創建過程,讓用戶可以指定自己想要的對象而不必關心對象的實例化過程。
這樣做的好處是用戶只需通過固定的介面而不是直接去調用類的實例化方法來獲得一個對象的實例,隱藏了實例創建過程的復雜度,解耦了生產實例和使用實例的代碼,降低了維護的復雜性。
工廠類負責創建的對象比較少。簡單工廠模式最大的優點在於實現對象的創建和對象的使用分離,但是如果產品過多時,會導致工廠代碼非常復雜。
簡單工廠模式的要點就在於當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。
看待任何事物都需要用辯證的觀點去看,任何事物都有兩面性,簡單工廠模式也是如此。有優點也有缺點。
優點:用戶只需要傳入具體產品,就可以得到實例化的類,不需要知道具體實現過程,一定程度上節省了理解成本。
缺點:如果具體產品角色很多的時候,定義簡單工廠就會比較麻煩。不利於擴展,具體產品比較復雜時也許缺點就大於優點了,還是需要理性選擇。
Ⅲ Python有設計模式么
單例模式:Python 的單例模式最好不要藉助類(在 Java 中藉助類是因為 Java 所有代碼都要寫在類中),而是通過一個模塊來實現。一個模塊的模塊內全局變數、模塊內全局函數,組合起來就是一個單例對象了。
模板方法模式:這個可以像其他語言一樣實現,但是如果要遵循鴨子類型原則的話,應該刪除公有的抽象父類(或介面),從而追求靈活性。
工廠方法模式、多例模式:這個也不用藉助類,直接寫一個全局函數作為工廠函數即可。因為 Python 中實例化是通過 call 類來完成的,現在改成 call 工廠函數,對客戶摳碼者是透明的。(從這點我表示理解 Python 沒有 new 操作符的好處了,使用通用的 call 定義,正交性極強)
裝飾器模式、代理模式:這個接觸過 Python 就不會不知道了,Python 內置的 decorator 語法如此著名。裝飾器模式和代理模式都可以通過這種方式完成。另外一種是對對象的裝飾或代理,這個也不需要按照契約編程的風格,讓代理對象實現被代理對象的抽象。一切動態代理,只需要通過重載屬性訪問操作符,神馬都簡單了(和 PHP 通過 __get、__set、__call 來實現動態代理很類似)。
原型模式:這個在 Python 中實現的不是那麼爽快,需要調用 來克隆原型對象。但是其實有另一種實現方式:之所以使用原型模式,是因為對象初始化需要較大開銷。我們只需要保存初始化的結果,並在產生新對象的時候賦予新對象即可。所以,通過元類控制對象被創建的過程,來實現原型模式,也是一種選擇。
Ⅳ Python 設計模式——狀態模式
行為模式關注的是對象的響應性,它們通過對象之間的交互以實現更復雜的功能。
狀態模式是一種行為設計模式,在該模式中,一個對象可以基於其內部狀態封裝多個行為。比如根據收音機的基本狀態(AM/FM),當調諧到 AM 或 FM 頻道時,掃描頻道的行為就會相應地發生動態的改變。
狀態模式的優點
狀態模式的缺點
Ⅳ Python設計模式:工廠方法模式
工廠,大家一般能想到的是生產產品的地方, 在設計模式中,工廠可分為:簡單工廠模式、工廠方法模式。 在前期推文 Python 簡單工廠模式 中有關於簡單工廠模式的解讀。
根據工廠的抽象程度可分為:工廠方法模式、抽象工廠模式。 該模式用於封裝和管理對象的創建,是一種創建型模式。
在簡單工廠模式中,只提供了一個工廠類,該工廠類處於對產品類進行實例化的中心位置,它知道每一個產品對象的創建細節,並決定何時實例化哪一個產品類。
簡單工廠模式最大的缺點是:當有新產品要加入到系統中時,必須修改工廠類,加入必要的處理邏輯,這違背了「開閉原則」。
在簡單工廠模式中,所有的產品都是由同一個工廠創建,工廠類職責較重,業務邏輯較為復雜,具體產品與工廠類之間的耦合度高,嚴重影響了系統的靈活性和擴展性,而工廠方法模式則可以很好地解決這一問題。因此工廠方法模式應運而生。
(1)、工廠方法模式定義一個用於創建對象的介面,但是工廠本身並不負責創建對象,而是讓子類決定將哪一個類實例化。工廠方法模式讓一個類的實例化延遲到其子類。 工廠方法的創建是通過繼承而不是通過實例化來完成的。
(2)、工廠方法模式就是簡單工廠模式的進一步抽象。由於面向對象多態性,工廠方法模式保持了簡單工廠的優點同時克服了它的缺點。工廠方法模式中,核心的工廠被提升為一個抽象類,將具體的創建工作交給他的子類完成。
這個抽象的工廠類僅規定具體工廠實現的介面,而不明確指出如何實例化一個產品類,這使得工廠方法模式允許系統在不修改原有產品結構的情況下輕松的引進新產品。
工廠方法使設計更加具有可定製性,它可以返回相同的實例或子類,而不是某種類型的對象。
前期分享的 Python 簡單工廠模式 和今天分享的Python 工廠方法模式,大家在實際應用時能解決問題滿足需求即可,可靈活變通,自由選擇,無所謂哪種設計模式更高級。
同時無論哪種設計模式,由於可能封裝了大量對象和工廠創建,當有新加入產品的需求時,需要修改已定義好的工廠相關的類,因此對於產品和工廠的擴展性不太友好,在選擇使用時利弊需要權衡一下。
Ⅵ python常用的幾種設計模式是什麼
單例模式:是一種常用的軟體設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中,某個類只能出現一個是實例時,單例對象就能派上用場。單例對象的要點有三個:一是某個類只能有一個實例;二是它必須自行創建整個實例,三是它必須自行向整個系統提供這個實例。
工廠模式:提供一個創建對象的介面,不像客戶端暴露創建對象的過程,使用一個公共的介面來創建對象,可以分為三種:簡單工廠、工廠方法、抽象工廠。一個類的行為或其演算法可以在運行時更改,這種類型的設計模式屬於行為型模式。
策略模式:是常見的設計模式之一,它是指對一系列的演算法定義,並將每一個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。換句話來講,就是針對一個問題而定義出一個解決的模板,這個模板就是具體的策略,每個策略都是按照這個模板進行的,這種情況下我們有新的策略時就可以直接按照模板來寫,而不會影響之前已經定義好的策略。
門面模式:門面模式也被稱作外觀模式。定義如下:要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行。門面模式提供一個高層次的介面,使得子系統更易於使用。門面模式注重統一的對象,也就是提供一個訪問子系統的介面。門面模式與模板模式有相似的地方,都是對一些需要重復方法的封裝。但本質上是不同的,模板模式是對類本身的方法的封裝,其被封裝的方法也可以單獨使用;門面模式,是對子系統的封裝,其被封裝的介面理論上是不會被單獨提出來使用的。
Ⅶ Python 設計模式——命令模式
命令模式是一種行為設計模式。可以用來實現比如安裝軟體時的安裝向導功能,通常安裝向導會通過多個步驟根據用戶的選擇了解用戶的偏好。安裝向導首先啟動一個名為 Command 的對象,用於存儲在向導的多個步驟中用戶指定的選項。當用戶在最後一個步驟中點擊完成按鈕時,Command 對象就會運行 execute() 方法,該方法會考察所有存儲的選項並完成相應的安裝過程。
命令模式通常包含以下術語:
命令模式的主要意圖:
命令模式的適用場景:
命令模式的優點:
命令模式的缺點:
