現(xiàn)代軟件開發(fā)需要解決復(fù)雜的業(yè)務(wù)需求。 它還需要考慮未來的可擴(kuò)展性和可維護(hù)性等因素。 良好的軟件系統(tǒng)設(shè)計(jì)對(duì)于實(shí)現(xiàn)這些目標(biāo)至關(guān)重要。 設(shè)計(jì)模式在這樣的系統(tǒng)中起著重要的作用。
要理解設(shè)計(jì)模式,考慮下面的例子 -
所以,反復(fù)建造/生產(chǎn)的所有東西,必然會(huì)在其設(shè)計(jì)中遵循一種模式……汽車,自行車,披薩,atm機(jī)器,甚至是沙發(fā)床。
幾乎成為軟件中某些邏輯/機(jī)制/技術(shù)的標(biāo)準(zhǔn)編碼方式的設(shè)計(jì),因此被稱為或研究為軟件設(shè)計(jì)模式。
使用設(shè)計(jì)模式的好處是 -
GoF(四人幫)設(shè)計(jì)模式分為三類,即創(chuàng)作型模式,結(jié)構(gòu)型模式和行為型模式。
創(chuàng)造性模式
創(chuàng)造性設(shè)計(jì)模式將對(duì)象創(chuàng)建邏輯與系統(tǒng)其余部分分開。創(chuàng)建模式不是創(chuàng)建對(duì)象,而是創(chuàng)建它們。 創(chuàng)建模式包括Abstract Factory,Builder,F(xiàn)actory Method,Prototype和Singleton。
由于語言的動(dòng)態(tài)特性,創(chuàng)造型模式在Python中不常用。 語言本身也為我們提供了足夠優(yōu)雅時(shí)尚所需的所有靈活性,但我們很少需要實(shí)現(xiàn)任何東西,比如singleton或Factory。
而且這些模式提供了一種在隱藏創(chuàng)建邏輯的同時(shí)創(chuàng)建對(duì)象的方法,而不是直接使用新的運(yùn)算符實(shí)例化對(duì)象。
結(jié)構(gòu)模式
有時(shí)候不是從頭開始,而是需要使用現(xiàn)有的一組類來構(gòu)建更大的結(jié)構(gòu)。 這就是結(jié)構(gòu)類模式使用繼承來構(gòu)建新結(jié)構(gòu)的地方。 結(jié)構(gòu)對(duì)象模式使用組合/聚合來獲得新的功能。 適配器,橋梁,復(fù)合材料,裝飾,外墻,享元和代理是結(jié)構(gòu)模式。 他們提供組織課堂層次結(jié)構(gòu)的最佳方法。
行為模式
行為模式提供了處理對(duì)象間通信的最佳方式。 這種類型下的模式是:訪問者,責(zé)任鏈,命令,口譯員,迭代器,調(diào)解員,紀(jì)念品,觀察者,狀態(tài),策略和模板方法都是行為模式。
由于它們代表系統(tǒng)的行為,因此通常用它們來描述軟件系統(tǒng)的功能。
單例
它是所有設(shè)計(jì)模式中最具爭議性和知名度之一。 它用于過度面向?qū)ο蟮恼Z言,是傳統(tǒng)的面向?qū)ο缶幊痰闹匾M成部分。
Singleton模式用于,
這里是UML圖,

class Logger(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_logger'):
cls._logger = super(Logger, cls).__new__(cls, *args, **kwargs)
return cls._logger
在這個(gè)例子中,Logger是一個(gè)Singleton。
當(dāng)__new__被調(diào)用時(shí),它通常會(huì)構(gòu)造該類的新實(shí)例。 當(dāng)重寫它時(shí),首先檢查單例實(shí)例是否已經(jīng)創(chuàng)建。 如果沒有創(chuàng)建,則使用supper調(diào)用來創(chuàng)建它。 因此,無論什么時(shí)候在Logger上調(diào)用構(gòu)造函數(shù),都會(huì)得到完全相同的實(shí)例。
>>>
>>> obj1 = Logger()
>>> obj2 = Logger()
>>> obj1 == obj2
True
>>>
>>> obj1
<__main__.Logger object at 0x03224090>
>>> obj2
<__main__.Logger object at 0x03224090>