建造者模式設計模式
咱們想要建立一個由多個部分構成的對象,並且它的構成須要一步一步地完成。只有當各個部分都建立好,這個對象纔算是完整的。這正是建造者設計模式的用武之地。
建造者模式將一個複雜對象的構造過程與其表現分離,這樣同一個構造過程可用於建立不一樣的表現。
現實生活中的例子:快餐店使用的就是建造者模式。即便存在不一樣的多種漢堡包和包裝,準備一個漢堡包及打包的過程是相同的。經典款漢堡包和奶酪漢堡包之間的區別在於表現,而不是建造過程。
指揮者是出納員,將須要準備什麼餐品的指令傳達給工做人員,建造者是工做人員中的個體,關注具體順序。
應用案例:建造者模式和工廠模式的主要區別在於工廠模式以單個步驟建立對象,而建造者模式以多個步驟建立對象,而且幾乎始終會使用一個指揮者。
另外一個區別是,在工廠模式下,會當即返回一個建立好的對象;而在建造者模式下,僅在須要時客戶端代碼才顯示地請求指揮者返回最終的對象。
#假設想買一臺新電腦,若是決定購置一臺也定的預配置的電腦型號,如蘋果1.4GHz Mac mini,則是使用工廠模式。 # 全部的規格都已經由製造商預先肯定,製造商不用向你諮詢什麼就知道本身該作什麼,他們一般接收僅僅是單條指令。 #工廠模式 MINI14 = '1.4GHz Mac mini' class AppleFactory: class MacMini14: def __init__(self): self.memory = 4 self.hdd = 500 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 don't know how to build {}.".format(model)) # if __name__ == '__main__': # afac = AppleFactory() # mac_mini = afac.build_computer(MINI14) # print(mac_mini) #建立者模式,購買提條定製的電腦,倘若這樣使用的則是建造者模式。你是指揮者,向製造商提供指令說明心中理想的電腦規格。 class Computer: def __init__(self,serial_number): self.serial = serial_number self.memory = None self.hdd = None self.gpu = None 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) 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))] 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()
小結ui
在如下狀況下,與工廠模式相比,建造者模式是更好的選擇。 1.想要建立一個複雜對象(對象由多個部分構成,且對象的建立要通過多個不一樣的步驟,這些步驟也許還需聽從特定的順序); 2.要求一個對象能有不一樣的表現,並但願將對象的構造與表現解耦; 3.想要在某個時間點建立對象,但在稍後的時間點再訪問。