Python設計模式:構建模式

1. 什么是構建模式

構建模式(Builder Pattern)是一種創建型設計模式,它允許使用多個簡單的對象一步步構建一個復雜的對象。構建模式通過將構建過程與表示分離,使得同樣的構建過程可以創建不同的表示。換句話說,構建模式提供了一種靈活的方式來創建復雜對象,避免了構造函數參數過多的問題。

  • 工廠模式通過一個工廠類來創建對象,適合于創建多個相似對象,隱藏了對象創建的具體實現。
  • 構建模式通過構建者和指揮者的組合,逐步構建一個復雜對象,適合于需要多個步驟和多個部分的組合。
  • 組合模式則允許將對象組合成樹形結構,適合于處理部分和整體的層次關系。

1.1 工廠模式與構建模式的對比

在工廠模式中,我們將創建一個簡單的汽車工廠來生成汽車對象。

class Car:def __init__(self, make, model):self.make = makeself.model = modeldef __str__(self):return f"{self.make} {self.model}"class CarFactory:@staticmethoddef create_car(make, model):return Car(make, model)# 客戶端代碼
if __name__ == "__main__":car1 = CarFactory.create_car("Toyota", "Camry")car2 = CarFactory.create_car("Honda", "Accord")print(car1)  # 輸出: Toyota Camryprint(car2)  # 輸出: Honda Accord

在構建模式中,我們將使用構建者模式逐步構建一個復雜的汽車對象。

# 產品類
class Car:def __init__(self):self.make = Noneself.model = Noneself.year = Noneself.color = Nonedef __str__(self):return f"{self.year} {self.color} {self.make} {self.model}"# 構建者接口
class CarBuilder:def set_make(self, make):passdef set_model(self, model):passdef set_year(self, year):passdef set_color(self, color):passdef build(self):pass# 具體構建者
class ConcreteCarBuilder(CarBuilder):def __init__(self):self.car = Car()def set_make(self, make):self.car.make = makedef set_model(self, model):self.car.model = modeldef set_year(self, year):self.car.year = yeardef set_color(self, color):self.car.color = colordef build(self):return self.car# 指揮者
class Director:def __init__(self, builder):self.builder = builderdef construct_car(self, make, model, year, color):self.builder.set_make(make)self.builder.set_model(model)self.builder.set_year(year)self.builder.set_color(color)return self.builder.build()# 客戶端代碼
if __name__ == "__main__":builder = ConcreteCarBuilder()director = Director(builder)# 構建一輛車car = director.construct_car("Toyota", "Camry", 2022, "Blue")print(car)  # 輸出: 2022 Blue Toyota Camry

1.2 組合模式與構建模式的對比

在組合模式中,我們將創建一個文件系統的結構,允許文件和文件夾以樹形結構組合。

class Component:def operation(self):passclass File(Component):def __init__(self, name):self.name = namedef operation(self):return f"File: {self.name}"class Folder(Component):def __init__(self, name):self.name = nameself.children = []def add(self, component):self.children.append(component)def remove(self, component):self.children.remove(component)def operation(self):results = [f"Folder: {self.name}"]for child in self.children:results.append(child.operation())return "\n".join(results)# 客戶端代碼
if __name__ == "__main__":file1 = File("file1.txt")file2 = File("file2.txt")folder1 = Folder("Folder 1")folder1.add(file1)folder1.add(file2)print(folder1.operation())

在構建模式中,我們將使用構建者模式逐步構建一個復雜的文件對象。

class File:def __init__(self, name):self.name = namedef __str__(self):return f"File: {self.name}"class Folder:def __init__(self, name):self.name = nameself.children = []def add(self, component):self.children.append(component)def remove(self, component):self.children.remove(component)def __str__(self):results = [f"Folder: {self.name}"]for child in self.children:results.append(str(child))return "\n".join(results)class FileBuilder:def __init__(self):self.folder = Nonedef create_folder(self, name):self.folder = Folder(name)def add_file(self, file_name):if self.folder:self.folder.add(File(file_name))def build(self):return self.folder# 客戶端代碼
if __name__ == "__main__":builder = FileBuilder()builder.create_folder("Folder 1")builder.add_file("file1.txt")builder.add_file("file2.txt")folder = builder.build()print(folder)  # 輸出: Folder: Folder 1\nFile: file1.txt\nFile: file2.txt

2. 構建模式的結構

構建模式通常包含以下幾個角色:

  1. 產品(Product):表示被構建的復雜對象。
  2. 構建者(Builder):定義了創建產品的抽象接口,包含構建產品的各個部分的方法。
  3. 具體構建者(ConcreteBuilder):實現了構建者接口,負責構建產品的具體部分。
  4. 指揮者(Director):負責管理構建過程,使用構建者來構建產品。
# 產品類
class Car:def __init__(self):self.make = Noneself.model = Noneself.year = Noneself.color = Nonedef __str__(self):return f"{self.year} {self.color} {self.make} {self.model}"# 構建者接口
class CarBuilder:def set_make(self, make):passdef set_model(self, model):passdef set_year(self, year):passdef set_color(self, color):passdef build(self):pass# 具體構建者
class ConcreteCarBuilder(CarBuilder):def __init__(self):self.car = Car()def set_make(self, make):self.car.make = makedef set_model(self, model):self.car.model = modeldef set_year(self, year):self.car.year = yeardef set_color(self, color):self.car.color = colordef build(self):return self.car# 指揮者
class Director:def __init__(self, builder):self.builder = builderdef construct_car(self, make, model, year, color):self.builder.set_make(make)self.builder.set_model(model)self.builder.set_year(year)self.builder.set_color(color)return self.builder.build()# 客戶端代碼
if __name__ == "__main__":builder = ConcreteCarBuilder()director = Director(builder)# 構建一輛車car = director.construct_car("Toyota", "Camry", 2022, "Blue")print(car)  # 輸出: 2022 Blue Toyota Camry
  1. 產品類(Car):表示被構建的復雜對象,包含多個屬性(如品牌、型號、年份和顏色),并實現了一個 __str__ 方法用于輸出對象的字符串表示。

  2. 構建者接口(CarBuilder):定義了創建產品的抽象接口,包含設置汽車各個屬性的方法。

  3. 具體構建者(ConcreteCarBuilder):實現了構建者接口,負責實現構建汽車的具體部分。它創建一個 Car 對象并逐步設置其屬性,最后返回構建好的 Car 對象。

  4. 指揮者(Director):負責管理構建過程,使用構建者來構建產品。它接受一個構建者對象,并通過調用構建者的方法來構建一個完整的 Car 對象。

  5. 客戶端代碼:創建了一個 ConcreteCarBuilder 實例和一個 Director 實例。通過指揮者的 construct_car 方法,逐步構建了一輛汽車,并最終輸出了構建好的汽車對象。

3. 示例 1:構建復雜的餐廳訂單系統

在日常開發中,構建模式常用于構建復雜對象的場景。一個典型的例子是餐廳訂單系統。在這個系統中,顧客可以選擇不同的菜品、飲料和配餐,最終生成一個完整的訂單。使用構建模式可以有效地管理這個復雜的構建過程。

在這個示例中,我們將創建一個訂單對象,顧客可以通過不同的步驟來構建這個訂單。我們將定義以下角色:

  1. 產品(Order):表示顧客的訂單,包含多個菜品和飲料。
  2. 構建者(OrderBuilder):定義了創建訂單的抽象接口,包含添加菜品和飲料的方法。
  3. 具體構建者(ConcreteOrderBuilder):實現了構建者接口,負責構建訂單的具體部分。
  4. 指揮者(Director):負責管理構建過程,使用構建者來構建訂單。
# 產品類
class Order:def __init__(self):self.dishes = []self.drinks = []def add_dish(self, dish):self.dishes.append(dish)def add_drink(self, drink):self.drinks.append(drink)def __str__(self):order_details = "Order Details:\n"order_details += "Dishes:\n" + "\n".join(self.dishes) + "\n"order_details += "Drinks:\n" + "\n".join(self.drinks)return order_details# 構建者接口
class OrderBuilder:def add_dish(self, dish):passdef add_drink(self, drink):passdef build(self):pass# 具體構建者
class ConcreteOrderBuilder(OrderBuilder):def __init__(self):self.order = Order()def add_dish(self, dish):self.order.add_dish(dish)def add_drink(self, drink):self.order.add_drink(drink)def build(self):return self.order# 指揮者
class Director:def __init__(self, builder):self.builder = builderdef construct_order(self, dishes, drinks):for dish in dishes:self.builder.add_dish(dish)for drink in drinks:self.builder.add_drink(drink)return self.builder.build()# 客戶端代碼
if __name__ == "__main__":builder = ConcreteOrderBuilder()director = Director(builder)# 構建一個訂單dishes = ["Spaghetti", "Caesar Salad", "Grilled Chicken"]drinks = ["Coke", "Water"]order = director.construct_order(dishes, drinks)print(order)  # 輸出訂單詳情
Order Details:
Dishes:
Spaghetti
Caesar Salad
Grilled Chicken
Drinks:
Coke
Water
  1. 產品類(Order):表示顧客的訂單,包含多個菜品和飲料。它提供了添加菜品和飲料的方法,并實現了一個 __str__ 方法用于輸出訂單的詳細信息。

  2. 構建者接口(OrderBuilder):定義了創建訂單的抽象接口,包含添加菜品和飲料的方法。

  3. 具體構建者(ConcreteOrderBuilder):實現了構建者接口,負責構建訂單的具體部分。它創建一個 Order 對象并逐步添加菜品和飲料,最后返回構建好的訂單對象。

  4. 指揮者(Director):負責管理構建過程,使用構建者來構建訂單。它接受一個構建者對象,并通過調用構建者的方法來構建一個完整的訂單對象。

  5. 客戶端代碼:創建了一個 ConcreteOrderBuilder 實例和一個 Director 實例。通過指揮者的 construct_order 方法,逐步構建了一個訂單,并最終輸出了訂單的詳細信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75960.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75960.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75960.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 VIM 編輯器對文件進行編輯

一、VIM 的兩種狀態 VIM(vimsual)是 Linux/UNIX 系列 OS 中通用的全屏編輯器。vim 分為兩種狀態,即命令狀態和編輯狀態,在命令狀態下,所鍵入的字符系統均作命令來處理;而編輯狀態則是用來編輯文本資料&…

GaussDB回調機制深度實踐:從事件驅動到系統集成

GaussDB回調機制深度實踐:從事件驅動到系統集成 一、回調機制核心概念 回調類型矩陣 二、核心實現技術棧 觸發器回調開發 sql -- 創建審計觸發器回調 CREATE OR REPLACE FUNCTION audit_trigger() RETURNS TRIGGER AS $$ BEGININSERT INTO audit_log (operati…

AI小白:AI算法中常用的數學函數

文章目錄 一、激活函數1. Sigmoid2. ReLU(Rectified Linear Unit)3. Tanh(雙曲正切)4. Softmax示例代碼:激活函數的實現 二、損失函數1. 均方誤差(MSE)2. 交叉熵損失(Cross-Entropy&…

idea 打不開terminal

IDEA更新到2024.3后Terminal終端打不開的問題_idea terminal打不開-CSDN博客

Python代碼list列表的使用和常用方法及增刪改查

Python代碼list列表的使用和常用方法及增刪改查 提示:幫幫志會陸續更新非常多的IT技術知識,希望分享的內容對您有用。本章分享的是Python基礎語法。前后每一小節的內容是存在的有:學習and理解的關聯性,希望對您有用~ python語法-p…

Open CASCADE學習|讀取點集擬合樣條曲線(續)

問題 上一篇文章已經實現了樣條曲線擬合,但是仍存在問題,Tolerance過大擬合成直線了,Tolerance過大頭尾波浪形。 正確改進方案 1?? 核心參數優化 通過調整以下參數控制曲線平滑度: Standard_Integer DegMin 3; // 最低階…

Python基礎知識點(列表與字典)

列表list[] # list [12,34,56,78] # print(list) """ 1.list可以保存同一類型的數據 或 不同類型的數據 2.list是有序的,所以可以通過[下標]訪問元素 3.list保存重復的值 4.list是可變的,可以添加 刪除元素 """ …

在 Elasticsearch 中使用 Amazon Nova 模型

作者:來自 Elastic Andre Luiz 了解如何在 Elasticsearch 中使用 Amazon Nova 系列模型。 在本文中,我們將討論 Amazon 的 AI 模型家族——Amazon Nova,并學習如何將其與 Elasticsearch 結合使用。 關于 Amazon Nova Amazon Nova 是 Amazon …

MySQL8.0.40編譯安裝(Mysql8.0.40 Compilation and Installation)

MySQL8.0.40編譯安裝 近期MySQL發布了8.0.40版本,與之前的版本相比,部分依賴包發生了變化,因此重新編譯一版,也便于大家參考。 1. 下載源碼 選擇對應的版本、選擇源碼、操作系統 如果沒有登錄或者沒有MySQL官網賬號&#xff0…

python中pyside6多個py文件生成exe

網上見到的教程大多數都是pyinstaller安裝單個py文件,針對多個py文件的打包,鮮有人提及;有也是部分全而多的解釋,讓人目不暇接,本次記錄自己設置一個聲波捕捉界面的打包過程。 1.pycharm中調用pyinstaller打包 參考鏈接:https://blog.csdn.net/weixin_45793544/articl…

Java中使用Function Call實現AI大模型與業務系統的集成?

這個理念實際上很早就出現了,只不過早期的模型推理理解能力比較差,用戶理解深度預測不夠,現在每天的迭代有了改進,逐步引入到我們本身的業務系統,讓AI大模型集成進來管理自身業務功能。當然現在也不是一個什么難事了。…

id 屬性自動創建 js 全局變量

給一個元素設置 id 屬性&#xff0c;它會在 js 中創建全局變量&#xff0c;如 <div class"test" click"test" id"idTest">test</div>test() {console.log(idTest:, window.idTest) }.test {height: 50px;width: 200px;background-c…

Android SELinux權限使用

Android SELinux權限使用 一、SELinux開關 adb在線修改seLinux(也可以改配置文件徹底關閉) $ getenforce; //獲取當前seLinux狀態,Enforcing(表示已打開),Permissive(表示已關閉) $ setenforce 1; //打開seLinux $ setenforce 0; //關閉seLinux二、命令查看sel…

【R語言繪圖】圈圖繪制代碼

繪制代碼 rm(list ls())# 加載必要包 library(data.table) library(circlize) library(ComplexHeatmap) library(rtracklayer) library(GenomicRanges) library(BSgenome) library(GenomicFeatures) library(dplyr)### 數據準備階段 ### # 1. 讀取染色體長度信息 df <- re…

vim 編輯器 使用教程

Vim是一款強大的文本&#xff08;代碼&#xff09;編輯器&#xff0c;它是由Bram Moolenaar于1991年開發完成。它的前身是Bill Joy開發的vi。名字的意義是Vi IMproved。 打開vim&#xff0c;直接在命令行輸入vim即可&#xff0c;或者vim <filename>. Vim分為四種模式&a…

C++20新增內容

C20 是 C 語言的一次重大更新&#xff0c;它引入了許多新特性&#xff0c;使代碼更現代化、簡潔且高效。以下是 C20 的主要新增內容&#xff1a; 1. 概念&#xff08;Concepts&#xff09; 概念用于約束模板參數&#xff0c;使模板編程更加直觀和安全。 #include <concept…

C++中常用的十大排序方法之4——希爾排序

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】 今日分享關于C中常用的排序方法之4——希爾排序的相…

詳細描述以太坊的gas、gaslimit、gasPrice

目錄 一、Gas 是什么? ? 簡要定義: ?? 舉例理解: 二、Gas Limit 是什么? ? 簡要定義: 分兩種: 舉例說明: 三、Gas Price 是什么? ? 簡要定義: 為什么它重要? 示例: 四、 EIP-1559 后的新機制(倫敦升級) 三個要素: 五、額外技巧(開發實用) 本文…

全國大學生數學建模競賽賽題深度分析報告(2010-2024)

全國大學生數學建模競賽賽題深度分析報告&#xff08;2010-2024&#xff09; 全國大學生數學建模競賽(CUMCM)是中國最具影響力的大學生科技競賽之一&#xff0c;本報告將對2010-2024年間的賽題進行全面統計分析&#xff0c;包括題目類型、領域分布、模型方法等多個維度&#x…

從獎勵到最優決策:動作價值函數與價值學習

從獎勵到最優決策&#xff1a;動作價值函數與價值學習 價值學習一、動作價值函數對 U t U_t Ut?求期望得到動作價值函數動作價值函數的意義最優動作價值函數(Optimal Action-Value Function)如何理解 Q ? Q^* Q?函數 二、價值學習的基本思想Deep Q-Network(DQN)DQN玩游戲的具…