python的設(shè)計(jì)模式都有哪些?
單例模式:Python 的單例模式最好不要借助類(在 Java 中借助類是因?yàn)?Java 所有代碼都要寫在類中),而是通過一個模塊來實(shí)現(xiàn)。一個模塊的模塊內(nèi)全局變量、模塊內(nèi)全局函數(shù),組合起來就是一個單例對象了。模板方法模式:這個可以像其他語言一樣實(shí)現(xiàn),但是如果要遵循鴨子類型原則的話,應(yīng)該刪除公有的抽象父類(或接口),從而追求靈活性。工廠方法模式、
多例模式:這個也不用借助類,直接寫一個全局函數(shù)作為工廠函數(shù)即可。因?yàn)?Python 中實(shí)例化是通過 call 類來完成的,現(xiàn)在改成 call 工廠函數(shù),對客戶摳碼者是透明的。(從這點(diǎn)我表示理解 Python 沒有 new 操作符的好處了,使用通用的 call 定義,正交性極強(qiáng))裝飾器模式、代理模式:這個接觸過 Python 就不會不知道了,Python 內(nèi)置的 decorator 語法如此著名。裝飾器模式和代理模式都可以通過這種方式完成。另外一種是對對象的裝飾或代理,這個也不需要按照契約編程的風(fēng)格,讓代理對象實(shí)現(xiàn)被代理對象的抽象。一切動態(tài)代理,只需要通過重載屬性訪問操作符,神馬都簡單了(和 PHP 通過 __get、__set、__call 來實(shí)現(xiàn)動態(tài)代理很類似)。
原型模式:這個在 Python 中實(shí)現(xiàn)的不是那么爽快,需要調(diào)用 copy 來克隆原型對象。但是其實(shí)有另一種實(shí)現(xiàn)方式:之所以使用原型模式,是因?yàn)閷ο蟪跏蓟枰^大開銷。我們只需要保存初始化的結(jié)果,并在產(chǎn)生新對象的時候賦予新對象即可。所以,通過元類控制對象被創(chuàng)建的過程,來實(shí)現(xiàn)原型模式,也是一種選擇。
有關(guān)更多人生哲理、技術(shù)干貨、職場守則等新鮮、有趣、深刻的內(nèi)容,歡迎大家關(guān)注江蘇優(yōu)就業(yè)自媒體旗下的自媒體工公號-江蘇優(yōu)就業(yè)(ID:jsujiuye)