建造者模式的適用範圍:想要建立乙個由多個部分組成的物件,而且它的構成需要一步接一步的完成。只有當各個部分都完成了,這個物件才完整。建造者模式表現為複雜物件的建立與表現相分離,這樣,同乙個過程就有不同的表現。
假設我們要建立乙個html頁面生成器就可以使用建造者模式。該模式中,有兩個參與者:建造者(builder)和指揮者(director)。建造者負責建立負責物件的各個組成部分。在html例子中,這些組成部分包括:頁面標題、文字標題、內容主體和頁尾。指揮者使用乙個建造者例項控制建造的過程。對於html示例,這裡指呼叫建造者的函式設定頁面標題、文字標題等。使用不同的建造者例項讓我們可以建立不同的html頁面,而無需更換指揮者**。
1. 現實生活中的例子
快餐店使用的即是建造者設計模式。即使存在多種漢堡包(經典款、乳酪漢堡包等等)和不同的包裝(大、中、小盒子等),準備乙個漢堡包及打包(盒子或者紙袋)的流程都是一樣的。兩種漢堡包的區別在於表現,而不在於建造的過www.cppcns.com程。指揮者是出納員,將需hqbnamjqg要準備什麼餐品的指令傳達給工作人員,即建造者。
2. 軟體的例子
本文一開始提到的html例子,在djan程式設計客棧go-widgy中得到了實際應用。django-widgy是乙個django的第三方樹編輯器擴充套件,可用作內容管理系統。它包含乙個網頁構建器,用來建立具有不同布局的html頁面。
django-query-builder是另乙個基於建造者模式的django第三方擴充套件庫,該擴充套件庫可用於動態地構建sql查詢。使用它,我們可以控制乙個查詢的方方面面,並能建立不同種類的查詢。
3. 應用案例
如果我們知道乙個物件必須經過多個步驟來建立,並且要求同乙個構造過程可用於產生不同的表現,就可以使用建造者模式。例如頁面生成器、文件轉換器以及使用者介面等等。
工廠模式與建造者模式的區別在於工廠模式以單個步驟建立物件,而建造者模式以多個步驟建立物件,且幾乎始終使用乙個指揮者。一些有針對性的建造者模式實現並未使用指揮者,如j**a的stringbuffer。
另乙個區別是,在工廠模式下,會立即返回乙個建立好的物件;而在建造者模式下,僅需要時客戶端**才顯示地請求指揮者返回最終的物件。
新電腦模擬的例子可能會有助於區分建造者模式和工廠模式。假設你想買一台新電腦,如果決定購買一台特定的預配置的電腦型號,例如,最新的蘋果1.4ghz mac mini,則是使用工廠模式。所有硬體的規格都已經有製造商預先確定,製造商不用向你諮詢就知道自己該做些什麼,它們通常接收的僅僅是單條指令。**如下
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)
另乙個選擇是購買一台定製的pc。假若這樣,使用的即是建造者模式。你是指揮者,向製造商(建造者)提供指令說明心中理想的電腦規格。
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()
基本的變化是引入了乙個建造者computerbuilder、乙個指揮者hardwareengineer以及一步接一步裝配一台電腦的過程,這樣現在就支援不同的配置了(注意, memory、 hdd及gpu是形參並未預先設定)。
4. 小結
本章中,我們學習了如何使用建造者設計模式。可以在工廠模式(工廠方法或抽象工廠)不適用的一些場景中使用建造者模式建立物件。在以下幾種情況下,與工廠模式相比,建造者模式是更好的選擇。
我們看到了快餐店如何將建造者模式用於準備食物,兩個第三方django擴充套件包( django-widgy和django-query-builder)各自如何使用建造者模式來生成html頁面和動態的sql查詢。我們重點學習了建造者模式與工廠模式之間的區別,通過對預先配置(工廠)電腦與客戶定製(建造者)電腦進行訂單模擬來理清這兩種設計模式。
本文標題: python建造者模式案例執行原理解析
本文位址: /jiaoben/python/324117.html
建造者模式案例
private string food 食物private string drink 飲料public string getfood public void setfood string food public string getdrink public void setdrink string ...
Python 建造者模式
usr bin python coding utf 8 建造者基類 class personbuilder def buildhead self pass def buildbody self pass def buildarm self pass def buildleg self pass 胖子...
Python設計模式 建造者模式
需求,畫人物,要求畫乙個人的頭,左手,右手,左腳,右腳和身體,畫乙個瘦子,乙個胖子 不使用設計模式 encoding utf 8 author kevinlu1010 qq.com if name name print 畫左手 print 畫右手 print 畫左腳 print 畫右腳 print ...