python入門4

設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐垒酬,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_發(fā)人員所采用慈省。設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案登澜。這些解決方案是眾多軟件開發(fā)人員經(jīng)過相當(dāng)長的一段時(shí)間的試驗(yàn)和錯(cuò)誤總結(jié)出來的抢蚀。

設(shè)計(jì)模式六大原則:

1.單一職責(zé)原則:

一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)地沮。

2.里氏替換原則:

所有引用基類(父類)的地方必須能透明的使用其子類的對象风响。

3.依賴倒置原則:

高層模塊不應(yīng)該依賴底層模塊嘉汰,二者都應(yīng)該依賴其抽象,抽象不應(yīng)該依賴細(xì)節(jié)状勤,細(xì)節(jié)應(yīng)該依賴抽象鞋怀。

4.接口隔離原則:

客戶端不應(yīng)該依賴它不需要的接口,一個(gè)類對另一個(gè)類的依賴持搜,應(yīng)該建立在最小的接口上密似。

5.迪米特法則:

一個(gè)對象應(yīng)該對其他對象保持最少的了解,盡量降低類與類之間的耦合葫盼。

6.開閉原則:

一個(gè)軟件實(shí)體如類残腌、模塊和函數(shù)應(yīng)該對擴(kuò)展開放,對修改關(guān)閉。

分類

創(chuàng)建型模式

主要目的:創(chuàng)建對象

共五種:工廠方法模式抛猫、抽象工廠模式蟆盹、單例模式、建造者模式闺金、原型模式日缨。

結(jié)構(gòu)型模式

主要目的:對象的組成和對象的關(guān)系

共七種:適配器模式、裝飾器模式掖看、代理模式匣距、外觀模式、橋接模式哎壳、組合模式毅待、享元模式。

行為型模式

主要目的:對象的行為归榕,對象能做什么

共十一種:策略模式尸红、模板方法模式、觀察者模式刹泄、迭代子模式外里、責(zé)任鏈模式、命令模式特石、備忘錄模式盅蝗、狀態(tài)模式、訪問者模式姆蘸、中介者模式墩莫、解釋器模式。

#定義伊蘭特車類

classYilanteCar(object):

#定義車的方法

defmove(self):

print("---伊蘭特在移動(dòng)---")

defstop(self):

print("---伊蘭特停車---")

#定義索納塔車類

classSuonataCar(object):

#定義車的方法

defmove(self):

print("---索納塔在移動(dòng)---")

defstop(self):

print("---索納塔停車---")

#定義一個(gè)生產(chǎn)汽車的工廠逞敷,讓其根據(jù)具體的訂單生產(chǎn)車

classCarFactory(object):

defcreateCar(self,typeName):

iftypeName?=="伊蘭特":

car?=?YilanteCar()

eliftypeName?=="索納塔":

car?=?SuonataCar()

returncar

#定義一個(gè)銷售北京現(xiàn)代車的店類

classCarStore(object):

def__init__(self):

#設(shè)置4s店的指定生產(chǎn)汽車的工廠

self.carFactory?=?CarFactory()

deforder(self,?typeName):

#讓工廠根據(jù)類型狂秦,生產(chǎn)一輛汽車

car=self.carFactory.createCar(typeName)

returncar

o1?=?CarStore()

o1.order('伊蘭特').move()

o1.order('伊蘭特').stop()

結(jié)果如下:


把生產(chǎn)環(huán)節(jié)重新創(chuàng)建了一個(gè)類,這確實(shí)比較像一種編程習(xí)慣推捐,此種解決方式被稱為簡單工廠模式裂问。

在創(chuàng)建對象比較簡單的時(shí)候,我們直接在主方法中做了牛柒,但是很多時(shí)候堪簿,創(chuàng)建對象需要一些初始化的操作,或者業(yè)務(wù)邏輯的處理焰络。也就是說戴甩,有時(shí)候創(chuàng)建一個(gè)對象會(huì)做比較復(fù)雜的操作,這個(gè)時(shí)候闪彼,如果所有對象的創(chuàng)建操作都放在主方法中甜孤,就不合適了协饲,怎么解決呢?使用簡單工廠模式

先來看看它的組成:

工廠類角色:這是本模式的核心缴川,含有一定的商業(yè)邏輯和判斷邏輯茉稠,用來創(chuàng)建產(chǎn)品

抽象產(chǎn)品角色:它一般是具體產(chǎn)品繼承的父類或者實(shí)現(xiàn)的接口。

具體產(chǎn)品角色:工廠類所創(chuàng)建的對象就是此角色的實(shí)例把夸。

簡單工廠的優(yōu)點(diǎn)和缺點(diǎn)

對象創(chuàng)建比較復(fù)雜的時(shí)候而线,可以考慮使用簡單工廠

優(yōu)點(diǎn):

在簡單工廠中主函數(shù)或者客戶端不再負(fù)責(zé)對象的創(chuàng)建,而是把這個(gè)責(zé)任交給工廠類恋日,主函數(shù)或者客戶端在使用對象的時(shí)候只從工廠中調(diào)用就行了膀篮,從而明確了各個(gè)類的職責(zé),符合單一職責(zé)原則)

缺點(diǎn)

由于這個(gè)工廠類負(fù)責(zé)所有對象的創(chuàng)建岂膳,那么當(dāng)子類增多時(shí)誓竿,我們就需要去修改工廠類的代碼,這樣呢谈截,就違反了一個(gè)原則:開閉原則

如何保證開閉原則筷屡?可以使用工廠方法模式。

工廠方法模塊組成:

抽象工廠角色:?這是工廠方法模式的核心簸喂,它與應(yīng)用程序無關(guān)毙死。是具體工廠角色必須實(shí)現(xiàn)的接口或者必須繼承的父類闯参。

具體工廠角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼塘砸。由應(yīng)用程序調(diào)用以創(chuàng)建對應(yīng)的具體產(chǎn)品的對象。

抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類或者是實(shí)現(xiàn)的接口乃沙。

具體產(chǎn)品角色:具體工廠角色所創(chuàng)建的對象就是此角色的實(shí)例诽表。

代碼如下:

#抽象產(chǎn)品角色

classCar():

defcarMove(self):

pass

defcarstop(self):

pass

#具體產(chǎn)品角色

classSuonataCar():

defsuonataMove(self):

print('索納塔正在運(yùn)行.........')

defsuonataStop(self):

print('索納塔已停止...........')

#具體產(chǎn)品角色

classYilanteCar():

defyilanteMove(self):

print('伊蘭特正在運(yùn)行.........')

defyilanteStop(self):

print('伊蘭特已停止...........')

#工廠父類:抽象工廠角色

classCarFactory():

defcreatCar(self):

pass

#工廠子類:具體工廠角色

classYilanteCarFactory():

defcreatCar(self):

returnYilanteCar()

#工廠子類:具體工廠角色

classSuonataCarFactory():

defcreatCar(self):

returnSuonataCar()

#主函數(shù)唉锌,程序開始

f1?=?YilanteCarFactory()

car1?=?f1.creatCar()

car1.yilanteMove()

car1.yilanteStop()

f2?=SuonataCarFactory()

car2?=?f2.creatCar()

car2.suonataMove()

car2.suonataStop()

結(jié)果如下:


解決了簡單工廠違反的開閉原則隅肥,但是如果需要增加一個(gè)具體產(chǎn)品類角色竿奏,需要添加這個(gè)類和相對于的工廠類,代碼量過大腥放。

__new__()和__init__()

classA():

def__init__(self):

print('....__init__....')

print(self)

print(id(self))

def__new__(cls):

print('....__new__....')

print(cls)

print(id(cls))

ret?=object.__new__(cls)

print(ret)

print(id(ret))

returnret

A()

結(jié)果如下:


__new__至少要有一個(gè)參數(shù)cls泛啸,代表要實(shí)例化的類,此參數(shù)在實(shí)例化時(shí)由Python解釋器自動(dòng)提供

__new__必須要有返回值秃症,返回實(shí)例化出來的實(shí)例候址,這點(diǎn)在自己實(shí)現(xiàn)__new__時(shí)要特別注意,可以return父類__new__出來的實(shí)例种柑,或者直接是object的__new__出來的實(shí)例

__init__有一個(gè)參數(shù)self岗仑,就是這個(gè)__new__返回的實(shí)例,__init__在__new__的基礎(chǔ)上可以完成一些其它初始化的動(dòng)作聚请,__init__不需要返回值荠雕。

單例設(shè)計(jì)模式

舉個(gè)常見的單例模式例子稳其,我們?nèi)粘J褂玫碾娔X上都有一個(gè)回收站,在整個(gè)操作系統(tǒng)中炸卑,回收站只能有一個(gè)實(shí)例既鞠,整個(gè)系統(tǒng)都使用這個(gè)唯一的實(shí)例,而且回收站自行提供自己的實(shí)例盖文。因此回收站是單例模式的應(yīng)用嘱蛋。

確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例五续,這個(gè)類稱為單例類洒敏,單例模式是一種對象創(chuàng)建型模式。

只調(diào)用一次__new__():

class?Singleton(object):

__instance?=?None

def?__new__(cls):

if?cls.__instance==None:

cls.__instance?=?object.__new__(cls)

return?cls.__instance

wangcai?=?Singleton()

xiaoqiang?=?Singleton()

print(wangcai==xiaoqiang)

print(id(wangcai))

print(id(xiaoqiang))

結(jié)果如下:


只調(diào)用一次__init__()和__new__():

class?Singleton(object):

#表示對象是否被創(chuàng)建?None:沒有疙驾,其它:已經(jīng)創(chuàng)建

__instance?=?None

#表示是否是第一次調(diào)用init,False:不是第一次???True:是第一次

__first_init?=?True

def?__init__(self,name):

if?Singleton.__first_init:

self.name?=?name

Singleton.__first_init?=?False

def?__new__(cls,name):

if?cls.__instance==None:

cls.__instance?=?object.__new__(cls)

return?cls.__instance

wangcai?=?Singleton('旺財(cái)')

xiaoqiang?=?Singleton('小強(qiáng)')

print(wangcai==xiaoqiang)

print(id(wangcai))

print(id(xiaoqiang))

結(jié)果如下:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桐玻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荆萤,更是在濱河造成了極大的恐慌镊靴,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件链韭,死亡現(xiàn)場離奇詭異偏竟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)敞峭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門踊谋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旋讹,你說我怎么就攤上這事殖蚕。” “怎么了沉迹?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵睦疫,是天一觀的道長。 經(jīng)常有香客問我鞭呕,道長蛤育,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任葫松,我火速辦了婚禮瓦糕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腋么。我一直安慰自己咕娄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布珊擂。 她就那樣靜靜地躺著圣勒,像睡著了一般徐块。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灾而,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天胡控,我揣著相機(jī)與錄音,去河邊找鬼旁趟。 笑死昼激,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锡搜。 我是一名探鬼主播橙困,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耕餐!你這毒婦竟也來了凡傅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肠缔,失蹤者是張志新(化名)和其女友劉穎夏跷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體明未,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡槽华,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趟妥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猫态。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖披摄,靈堂內(nèi)的尸體忽然破棺而出亲雪,到底是詐尸還是另有隱情,我是刑警寧澤疚膊,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布义辕,位于F島的核電站,受9級(jí)特大地震影響酿联,放射性物質(zhì)發(fā)生泄漏终息。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一贞让、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柳譬,春花似錦喳张、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摸航。三九已至,卻和暖如春舅桩,著一層夾襖步出監(jiān)牢的瞬間酱虎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工擂涛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留读串,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓撒妈,卻偏偏與公主長得像恢暖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子狰右,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1.1面向?qū)ο?面向?qū)ο?object-oriented ;簡稱: OO)至今還沒有統(tǒng)一的概念 我這里把它定義為:...
    TENG書閱讀 570評論 0 0
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉杰捂,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,726評論 0 9
  • 在夢中的城市里,他正值青春棋蚌,而到達(dá)伊西多拉城時(shí)嫁佳,他已年老。廣場上有一堵墻谷暮,老人們倚坐在那里看著過往的年輕人脱拼;他和這...
    心期千劫閱讀 1,332評論 0 0
  • 夏天的公園里,鳥語花香坷备,樹木茂盛熄浓,池塘里的風(fēng)景更加迷人。 走進(jìn)公園省撑,就能聞到誘人的花香赌蔑,那一池子...
    新啟航張老師閱讀 259評論 0 0
  • 01 不知道你是否跟我一樣,在某一個(gè)夜深人靜的晚上竟秫,在某一個(gè)寧靜溫和的午后娃惯。腦中的記性倒帶般停留在幾年或者十幾年前...
    遠(yuǎn)方和書閱讀 2,071評論 22 58