最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python建造者模式案例運(yùn)行原理解析

 更新時(shí)間:2020年06月29日 09:53:36   作者:JonnyJiang-zh  
這篇文章主要介紹了python建造者模式案例運(yùn)行原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

建造者模式的適用范圍:想要?jiǎng)?chuàng)建一個(gè)由多個(gè)部分組成的對(duì)象,而且它的構(gòu)成需要一步接一步的完成。只有當(dāng)各個(gè)部分都完成了,這個(gè)對(duì)象才完整。建造者模式表現(xiàn)為復(fù)雜對(duì)象的創(chuàng)建與表現(xiàn)相分離,這樣,同一個(gè)過程就有不同的表現(xiàn)。

​ 假設(shè)我們要?jiǎng)?chuàng)建一個(gè)HTML頁面生成器就可以使用建造者模式。該模式中,有兩個(gè)參與者:建造者(builder)和指揮者(director)。建造者負(fù)責(zé)創(chuàng)建負(fù)責(zé)對(duì)象的各個(gè)組成部分。在HTML例子中,這些組成部分包括:頁面標(biāo)題、文本標(biāo)題、內(nèi)容主體和頁腳。指揮者使用一個(gè)建造者實(shí)例控制建造的過程。對(duì)于HTML示例,這里指調(diào)用建造者的函數(shù)設(shè)置頁面標(biāo)題、文本標(biāo)題等。使用不同的建造者實(shí)例讓我們可以創(chuàng)建不同的HTML頁面,而無需更換指揮者代碼。

1. 現(xiàn)實(shí)生活中的例子

快餐店使用的即是建造者設(shè)計(jì)模式。即使存在多種漢堡包(經(jīng)典款、奶酪漢堡包等等)和不同的包裝(大、中、小盒子等),準(zhǔn)備一個(gè)漢堡包及打包(盒子或者紙袋)的流程都是一樣的。兩種漢堡包的區(qū)別在于表現(xiàn),而不在于建造的過程。指揮者是出納員,將需要準(zhǔn)備什么餐品的指令傳達(dá)給工作人員,即建造者。

2. 軟件的例子

本文一開始提到的HTML例子,在django-widgy中得到了實(shí)際應(yīng)用。django-widgy是一個(gè)Django的第三方樹編輯器擴(kuò)展,可用作內(nèi)容管理系統(tǒng)。它包含一個(gè)網(wǎng)頁構(gòu)建器,用來創(chuàng)建具有不同布局的HTML頁面。

​ django-query-builder是另一個(gè)基于建造者模式的Django第三方擴(kuò)展庫,該擴(kuò)展庫可用于動(dòng)態(tài)地構(gòu)建SQL查詢。使用它,我們可以控制一個(gè)查詢的方方面面,并能創(chuàng)建不同種類的查詢。

3. 應(yīng)用案例

如果我們知道一個(gè)對(duì)象必須經(jīng)過多個(gè)步驟來創(chuàng)建,并且要求同一個(gè)構(gòu)造過程可用于產(chǎn)生不同的表現(xiàn),就可以使用建造者模式。例如頁面生成器、文檔轉(zhuǎn)換器以及用戶界面等等。

​ 工廠模式與建造者模式的區(qū)別在于工廠模式以單個(gè)步驟創(chuàng)建對(duì)象,而建造者模式以多個(gè)步驟創(chuàng)建對(duì)象,且?guī)缀跏冀K使用一個(gè)指揮者。一些有針對(duì)性的建造者模式實(shí)現(xiàn)并未使用指揮者,如Java的StringBuffer。

​ 另一個(gè)區(qū)別是,在工廠模式下,會(huì)立即返回一個(gè)創(chuàng)建好的對(duì)象;而在建造者模式下,僅需要時(shí)客戶端代碼才顯示地請(qǐng)求指揮者返回最終的對(duì)象。

​ 新電腦類比的例子可能會(huì)有助于區(qū)分建造者模式和工廠模式。假設(shè)你想買一臺(tái)新電腦,如果決定購買一臺(tái)特定的預(yù)配置的電腦型號(hào),例如,最新的蘋果1.4GHz Mac mini,則是使用工廠模式。所有硬件的規(guī)格都已經(jīng)有制造商預(yù)先確定,制造商不用向你咨詢就知道自己該做些什么,它們通常接收的僅僅是單條指令。代碼如下

MINI14 = '1.4GHz Mac mini'
class AppleFactory:
	class MacMini14:
		def __init__(self):
			self.memory = 4 # 單位為GB
   self.hdd = 500 # 單位為GB
   self.gpu = 'Intel HD Graphics 5000'
		def __str__(self):
			info = ('Model: {}'.format(MINI14),'Memory: {}GB'.format(self.memory),'Hard Disk: {}GB'.format(self.hdd),'Graphics Card: {}'.format(self.gpu))
			return '\n'.join(info)
	def build_computer(self, model):
		if (model == MINI14):
			return self.MacMini14()
		else:
			print("I dont't know how to build {}".format(model))
if __name__ == '__main__':
	afac = AppleFactory()
	mac_mini = afac.build_computer(MINI14)
	print(mac_mini)

另一個(gè)選擇是購買一臺(tái)定制的PC。假若這樣,使用的即是建造者模式。你是指揮者,向制造商(建造者)提供指令說明心中理想的電腦規(guī)格。

class Computer:
	def __init__(self, serial_number):
		self.serial = serial_number
		self.memory = None # 單位為GB
		self.hdd = None # 單位為GB
		self.gpu = None
	def __str__(self):
		info = ('Memory: {}GB'.format(self.memory),'Hard Disk: {}GB'.format(self.hdd),'Graphics Card: {}'.format(self.gpu))
		return '\n'.join(info)
class ComputerBuilder:
	def __init__(self):
		self.computer = Computer('AG23385193')
	def configure_memory(self, amount):
		self.computer.memory = amount
	def configure_hdd(self, amount):
		self.computer.hdd = amount
	def configure_gpu(self, gpu_model):
		self.computer.gpu = gpu_model
class HardwareEngineer:
	def __init__(self):
		self.builder = None
	def construct_computer(self, memory, hdd, gpu):
		self.builder = ComputerBuilder()①
		[step for step in (self.builder.configure_memory(memory),self.builder.configure_hdd(hdd),self.builder.configure_gpu(gpu))]
	@property
	def computer(self):
		return self.builder.computer
def main():
	engineer = HardwareEngineer()
	engineer.construct_computer(hdd=500, memory=8, gpu='GeForce GTX 650 Ti')
	computer = engineer.computer
	print(computer)
if __name__ == '__main__':
	main()	

基本的變化是引入了一個(gè)建造者ComputerBuilder、一個(gè)指揮者HardwareEngineer以及一步接一步裝配一臺(tái)電腦的過程,這樣現(xiàn)在就支持不同的配置了(注意, memory、 hdd及gpu是形參并未預(yù)先設(shè)置)。

4. 小結(jié)

本章中,我們學(xué)習(xí)了如何使用建造者設(shè)計(jì)模式??梢栽诠S模式(工廠方法或抽象工廠)不適用的一些場景中使用建造者模式創(chuàng)建對(duì)象。在以下幾種情況下,與工廠模式相比,建造者模式是更好的選擇。

  • [ ] 想要?jiǎng)?chuàng)建一個(gè)復(fù)雜對(duì)象(對(duì)象由多部分組成,且創(chuàng)建對(duì)象的過程結(jié)果許多步驟,也許這些步驟還需要特定的順序)。
  • [ ] 要求一個(gè)對(duì)象有許多不同的表現(xiàn),并希望對(duì)象的構(gòu)造與表現(xiàn)得耦合度低
  • [ ] 想要在不同得時(shí)間創(chuàng)建對(duì)象

​ 我們看到了快餐店如何將建造者模式用于準(zhǔn)備食物,兩個(gè)第三方Django擴(kuò)展包( django-widgy和django-query-builder)各自如何使用建造者模式來生成HTML頁面和動(dòng)態(tài)的SQL查詢。我們重點(diǎn)學(xué)習(xí)了建造者模式與工廠模式之間的區(qū)別,通過對(duì)預(yù)先配置(工廠)電腦與客戶定制(建造者)電腦進(jìn)行訂單類比來理清這兩種設(shè)計(jì)模式。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 教你學(xué)會(huì)通過python的matplotlib庫繪圖

    教你學(xué)會(huì)通過python的matplotlib庫繪圖

    今天教大家如何學(xué)會(huì)通過python的matplotlib庫繪圖,文中有非常詳細(xì)的圖文解說及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • numpy數(shù)組的重塑和轉(zhuǎn)置實(shí)現(xiàn)

    numpy數(shù)組的重塑和轉(zhuǎn)置實(shí)現(xiàn)

    本文主要介紹了numpy數(shù)組的重塑和轉(zhuǎn)置實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 淺談Python淺拷貝、深拷貝及引用機(jī)制

    淺談Python淺拷貝、深拷貝及引用機(jī)制

    本篇文章主要介紹了Python淺拷貝、深拷貝及引用機(jī)制,詳細(xì)的介紹了淺拷貝、深拷貝的介紹和區(qū)別,有興趣的可以了解一下。
    2016-12-12
  • 將python依賴包打包成window下可執(zhí)行文件bat方式

    將python依賴包打包成window下可執(zhí)行文件bat方式

    今天小編就為大家分享一篇將python依賴包打包成window下可執(zhí)行文件bat方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中列表的各種操作方法詳解

    Python中列表的各種操作方法詳解

    這篇文章主要介紹了Python中列表的各種操作方法詳解,列表都可以進(jìn)行的操作包括索引、切片、加、乘、檢查成員,此外,Python 已經(jīng)內(nèi)置確定序列的長度以及確定最大和最小的元素的方法,需要的朋友可以參考下
    2023-08-08
  • Python使用pyinstaller打包成.exe文件執(zhí)行后閃退的圖文解決辦法

    Python使用pyinstaller打包成.exe文件執(zhí)行后閃退的圖文解決辦法

    這篇文章主要給大家介紹了關(guān)于Python使用pyinstaller打包成.exe文件執(zhí)行后閃退的圖文解決辦法,閃退問題通常是由于程序運(yùn)行過程中出現(xiàn)了未處理的異?;蝈e(cuò)誤,導(dǎo)致程序崩潰,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • python讀取word文檔的方法

    python讀取word文檔的方法

    這篇文章主要介紹了python讀取word文檔的方法,實(shí)例分析了Python基于win32com操作word文檔的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 深入淺析python變量加逗號(hào),的含義

    深入淺析python變量加逗號(hào),的含義

    這篇文章主要介紹了python變量加逗號(hào),的含義,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python和Matlab實(shí)現(xiàn)蝙蝠算法的示例代碼

    Python和Matlab實(shí)現(xiàn)蝙蝠算法的示例代碼

    蝙蝠算法是一種搜索全局最優(yōu)解的有效方法,本文主要介紹了Python和Matlab實(shí)現(xiàn)蝙蝠算法的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Python Matplotlib繪制動(dòng)畫的代碼詳解

    Python Matplotlib繪制動(dòng)畫的代碼詳解

    使用matplotlib可以很容易地創(chuàng)建動(dòng)畫框架。在本文中我們就將利用Matplotlib制作幾個(gè)簡單的動(dòng)畫,文中的示例代碼講講詳細(xì),感興趣的可以了解下
    2022-05-05

最新評(píng)論

苗栗县| 文山县| 南澳县| 高碑店市| 禄丰县| 白银市| 古蔺县| 名山县| 杂多县| 咸宁市| 额尔古纳市| 九龙城区| 尼木县| 洪泽县| 化德县| 长丰县| 高碑店市| 宾川县| 两当县| 基隆市| 平和县| 巴彦县| 县级市| 林口县| 武宣县| 延川县| 上栗县| 临夏市| 叙永县| 交口县| 涟源市| 封丘县| 福鼎市| 射洪县| 怀柔区| 北流市| 绩溪县| 米脂县| 加查县| 长乐市| 太康县|