当前位置: 首页 > wzjs >正文

申请好域名后 怎么做网站网站自己做需要多少钱

申请好域名后 怎么做网站,网站自己做需要多少钱,搭建本地网站,赣州市建设培训网Python设计模式深度解析:建造者模式(Builder Pattern)完全指南前言什么是建造者模式?建造者模式的核心思想模式的核心组成实际案例一:UI选择组件的动态构建抽象建造者基类具体建造者实现列表框建造者复选框建造者工厂建…

Python设计模式深度解析:建造者模式(Builder Pattern)完全指南

    • 前言
    • 什么是建造者模式?
      • 建造者模式的核心思想
      • 模式的核心组成
    • 实际案例一:UI选择组件的动态构建
      • 抽象建造者基类
      • 具体建造者实现
        • 列表框建造者
        • 复选框建造者
      • 工厂建造者(Director角色)
      • 完整的应用构建
    • 实际案例二:数据结构的分步构建
      • 州数据的构建
    • 高级建造者模式:流式接口
    • 建造者模式的优缺点
      • 优点
      • 缺点
    • 与其他模式的区别
      • 建造者模式 vs 工厂模式
      • 建造者模式 vs 抽象工厂模式
    • 实际应用场景
    • 最佳实践
    • 总结

前言

在软件开发中,我们经常需要创建复杂的对象,这些对象可能包含多个组成部分,并且创建过程可能很复杂。如果直接在构造函数中处理所有的创建逻辑,会导致代码难以维护和扩展。建造者模式(Builder Pattern)正是为了解决这个问题而诞生的一种创建型设计模式。

本文将通过实际的UI构建和数据处理案例,深入讲解Python中建造者模式的实现原理、应用场景和最佳实践。

什么是建造者模式?

建造者模式是一种创建型设计模式,它允许你分步骤创建复杂对象。该模式将复杂对象的构建过程分解为多个简单的步骤,通过不同的建造者可以创建不同表示的对象。

建造者模式的核心思想

将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。

模式的核心组成

  1. Director(指挥者):控制构建过程,调用建造者的方法
  2. Builder(抽象建造者):定义构建复杂对象的抽象接口
  3. ConcreteBuilder(具体建造者):实现Builder接口,构建具体产品
  4. Product(产品):被构建的复杂对象

实际案例一:UI选择组件的动态构建

让我们通过一个实际的UI构建案例来理解建造者模式。这个案例展示了如何根据数据量的不同,动态选择不同的UI组件。

抽象建造者基类

class MultiChoice:"""多选组件的抽象基类"""def __init__(self, frame, choiceList):self.choices = choiceList    # 保存选择列表self.frame = frame# 待派生类实现的抽象方法def makeUI(self): pass  # 构建UI组件def getSelected(self): pass  # 获取选中项目def clearAll(self):"""清除框架中的所有组件"""for widget in self.frame.winfo_children():widget.destroy()

具体建造者实现

列表框建造者
class ListboxChoice(MultiChoice):"""列表框选择建造者"""def __init__(self, frame, choices):super().__init__(frame, choices)def makeUI(self):"""构建列表框UI"""self.clearAll()# 创建多选列表框self.list = Listbox(self.frame, selectmode=MULTIPLE)self.list.pack()# 添加选项到列表框for item in self.choices:self.list.insert(END, item)def getSelected(self):"""获取选中的项目"""sel = self.list.curselection()selected_items = []for i in sel:item = self.list.get(i)selected_items.append(item)return selected_items
复选框建造者
class Checkbox(Checkbutton):"""自定义复选框组件"""def __init__(self, root, text, var):super().__init__(root, text=text, variable=var)self.text = textself.var = vardef getText(self):return self.textdef getVar(self):return int(self.var.get())class CheckboxChoice(MultiChoice):"""复选框选择建造者"""def __init__(self, panel, choices):super().__init__(panel, choices)def makeUI(self):"""构建复选框UI"""self.boxes = []  # 存储复选框列表self.clearAll()row = 0for name in self.choices:var = IntVar()  # 创建变量checkbox = Checkbox(self.frame, name, var)self.boxes.append(checkbox)checkbox.grid(column=0, row=row, sticky=W)row += 1def getSelected(self):"""获取选中的复选框"""selected_items = []for box in self.boxes:if box.getVar() > 0:selected_items.append(box.getText())return selected_items

工厂建造者(Director角色)

class ChoiceFactory:"""选择组件工厂 - 充当Director角色"""def getChoiceUI(self, choices, frame):"""根据选择数量决定使用哪种UI组件"""if len(choices) <= 3:# 选项少时使用复选框return CheckboxChoice(frame, choices)else:# 选项多时使用列表框return ListboxChoice(frame, choices)

完整的应用构建

import tkinter as tk
from tkinter import *
from tkinter import messageboxclass Securities:"""证券数据类"""def __init__(self, name, security_list):self.name = nameself.list = security_listdef getName(self):return self.namedef getList(self):return self.listclass BuildUI:"""UI构建器类 - 主要的Director"""def __init__(self, root):self.root = rootself.root.geometry("400x300")self.root.title("投资组合构建器")self.seclist = []def build(self):"""构建完整的应用界面"""# 第一步:创建数据self._build_data()# 第二步:构建左侧选择面板self._build_left_panel()# 第三步:构建右侧显示面板self._build_right_panel()# 第四步:构建控制按钮self._build_controls()def _build_data(self):"""构建证券数据"""self.stocks = Securities("股票", ["苹果公司", "微软", "谷歌", "亚马逊", "特斯拉"])self.seclist.append(self.stocks)self.bonds = Securities("债券", ["国债2024", "企业债2025", "地方债2026"])self.seclist.append(self.bonds)self.funds = Securities("基金", ["沪深300ETF", "创业板ETF"])self.seclist.append(self.funds)def _build_left_panel(self):"""构建左侧选择面板"""left_frame = Frame(self.root)left_frame.grid(row=0, column=0, padx=10, pady=10)Label(left_frame, text="投资类型:").pack()self.leftList = Listbox(left_frame, exportselection=FALSE)self.leftList.pack()# 添加证券类型for sec in self.seclist:self.leftList.insert(END, sec.getName())# 绑定选择事件self.leftList.bind('<<ListboxSelect>>', self.on_type_select)def _build_right_panel(self):"""构建右侧显示面板"""self.right_frame = Frame(self.root, name="right")self.right_frame.grid(row=0, column=1, padx=10, pady=10)Label(self.right_frame, text="具体选择:").pack()def _build_controls(self):"""构建控制按钮"""button_frame = Frame(self.root)button_frame.grid(row=1, column=0, columnspan=2, pady=10)show_button = Button(button_frame, text="显示选择", command=self.show_selected)show_button.pack()def on_type_select(self, event):"""类型选择事件处理"""selection = self.leftList.curselection()if selection:index = int(selection[0])securities = self.seclist[index]# 使用工厂创建合适的UI组件factory = ChoiceFactory()self.choice_ui = factory.getChoiceUI(securities.getList(), self.right_frame)self.choice_ui.makeUI()def show_selected(self):"""显示选中的项目"""if hasattr(self, 'choice_ui'):selected = self.choice_ui.getSelected()if selected:message = "您选择了:\n" + "\n".join(selected)messagebox.showinfo("选择结果", message)else:messagebox.showinfo("提示", "请先选择投资产品")# 使用示例
def main():root = tk.Tk()builder = BuildUI(root)builder.build()root.mainloop()if __name__ == "__main__":main()

实际案例二:数据结构的分步构建

让我们看另一个案例,展示如何使用建造者模式构建复杂的数据结构:

州数据的构建

class State:"""州数据对象"""def __init__(self, state_string):self._tokens = state_string.strip().split(",")self._statename = ""if len(self._tokens) > 3:self._statename = self._tokens[0]self._abbrev = self._tokens[1]self._founded = self._tokens[2]self._capital = self._tokens[3]def getStateName(self):return self._statenamedef getCapital(self):return self._capitaldef getAbbrev(self):return self._abbrevdef getFounded(self):return self._foundedclass StateListBuilder:"""州列表建造者"""def __init__(self):self._states = []def load_from_file(self, filename):"""从文件加载数据"""try:with open(filename, 'r', encoding='utf-8') as file:self.contents = file.readlines()except FileNotFoundError:# 如果文件不存在,使用示例数据self.contents = ["California,CA,1850,Sacramento\n","Texas,TX,1845,Austin\n","New York,NY,1788,Albany\n","Florida,FL,1845,Tallahassee\n"]return selfdef parse_states(self):"""解析州数据"""for line in self.contents:if len(line.strip()) > 0:state = State(line)if state.getStateName():  # 确保解析成功self._states.append(state)return selfdef sort_by_name(self):"""按名称排序"""self._states.sort(key=lambda s: s.getStateName())return selfdef filter_by_founded_year(self, min_year):"""按成立年份过滤"""filtered_states = []for state in self._states:try:if int(state.getFounded()) >= min_year:filtered_states.append(state)except ValueError:# 如果年份格式不正确,保留该州filtered_states.append(state)self._states = filtered_statesreturn selfdef build(self):"""构建最终的州列表"""return self._states# 使用建造者模式构建州列表
def create_state_list():"""演示建造者模式的使用"""# 方式1:基本构建basic_states = (StateListBuilder().load_from_file("states.txt").parse_states().build())# 方式2:带排序的构建sorted_states = (StateListBuilder().load_from_file("states.txt").parse_states().sort_by_name().build())# 方式3:带过滤的构建modern_states = (StateListBuilder().load_from_file("states.txt").parse_states().filter_by_founded_year(1800).sort_by_name().build())return basic_states, sorted_states, modern_states

高级建造者模式:流式接口

流式建造者模式提供了更优雅的API:

class ComputerBuilder:"""计算机建造者 - 流式接口"""def __init__(self):self.computer = {'cpu': None,'memory': None,'storage': None,'graphics': None,'peripherals': []}def cpu(self, cpu_type):"""设置CPU"""self.computer['cpu'] = cpu_typereturn selfdef memory(self, memory_size):"""设置内存"""self.computer['memory'] = memory_sizereturn selfdef storage(self, storage_type):"""设置存储"""self.computer['storage'] = storage_typereturn selfdef graphics(self, graphics_card):"""设置显卡"""self.computer['graphics'] = graphics_cardreturn selfdef add_peripheral(self, peripheral):"""添加外设"""self.computer['peripherals'].append(peripheral)return selfdef build(self):"""构建最终的计算机配置"""return self.computer.copy()# 使用流式建造者
def demo_fluent_builder():"""演示流式建造者的使用"""# 游戏电脑配置gaming_pc = (ComputerBuilder().cpu("Intel i9-12900K").memory("32GB DDR4").storage("1TB NVMe SSD").graphics("RTX 4080").add_peripheral("机械键盘").add_peripheral("游戏鼠标").add_peripheral("144Hz显示器").build())# 办公电脑配置office_pc = (ComputerBuilder().cpu("Intel i5-12400").memory("16GB DDR4").storage("512GB SSD").graphics("集成显卡").add_peripheral("无线键鼠套装").build())print("游戏电脑配置:", gaming_pc)print("办公电脑配置:", office_pc)if __name__ == "__main__":demo_fluent_builder()

建造者模式的优缺点

优点

  1. 分离构建和表示:构建过程和最终表示分离,提高了灵活性
  2. 精细控制构建过程:可以精细控制对象的构建过程
  3. 代码复用:相同的构建过程可以创建不同的产品
  4. 易于扩展:可以独立地扩展建造者和产品
  5. 支持流式接口:提供更优雅的API

缺点

  1. 增加代码复杂性:需要创建多个新类
  2. 产品相似性要求:要求产品有足够的相似性
  3. 内部结构暴露:建造者需要了解产品的内部结构

与其他模式的区别

建造者模式 vs 工厂模式

特性工厂模式建造者模式
目的创建对象构建复杂对象
过程一步创建分步构建
复杂度简单对象复杂对象
控制工厂控制指挥者控制
产品单一产品复杂产品

建造者模式 vs 抽象工厂模式

  • 抽象工厂模式:强调产品族的创建
  • 建造者模式:强调复杂对象的分步构建

实际应用场景

  1. SQL查询构建:分步构建复杂的SQL语句
  2. 配置对象创建:构建复杂的配置对象
  3. UI组件构建:构建复杂的用户界面组件
  4. 文档生成:分步构建复杂的文档结构
  5. 测试数据构建:构建复杂的测试数据对象

最佳实践

  1. 明确构建步骤:将复杂的构建过程分解为清晰的步骤
  2. 使用流式接口:提供更优雅的API体验
  3. 验证构建结果:在build()方法中验证对象的完整性
  4. 支持重置:允许重置建造者以构建新对象
  5. 文档化构建过程:清楚地文档化每个构建步骤的作用

总结

建造者模式是一种强大的创建型设计模式,它通过将复杂对象的构建过程分解为多个简单步骤,提供了灵活且可控的对象创建方式。

通过本文的学习,我们了解了:

  • 建造者模式的核心概念和组成
  • 实际的UI构建和数据处理应用案例
  • 流式建造者的优雅实现
  • 与其他创建型模式的区别
  • 实际应用场景和最佳实践

在实际开发中,当你需要创建复杂对象,并且希望构建过程具有良好的可控性和可扩展性时,建造者模式是一个很好的选择。记住,设计模式是工具,选择最适合当前问题的解决方案才是最重要的。


文章转载自:

http://BT8bN8w5.jbqwb.cn
http://XemXjfy9.jbqwb.cn
http://yLJuE19z.jbqwb.cn
http://BW7RUMnf.jbqwb.cn
http://nY5KmzWf.jbqwb.cn
http://md88EAil.jbqwb.cn
http://0sM4BohM.jbqwb.cn
http://RzK1wl2n.jbqwb.cn
http://SrSGuwT7.jbqwb.cn
http://7rx0BnKP.jbqwb.cn
http://lfQ0Ljwf.jbqwb.cn
http://QiA3d9Po.jbqwb.cn
http://KQBquM2Y.jbqwb.cn
http://HQbdisPm.jbqwb.cn
http://QizWNuED.jbqwb.cn
http://apEbKcyb.jbqwb.cn
http://eZhJUQXX.jbqwb.cn
http://o6qmgWty.jbqwb.cn
http://hpqP2wCK.jbqwb.cn
http://cke6EcwI.jbqwb.cn
http://N2XEWr71.jbqwb.cn
http://qXWtaO1F.jbqwb.cn
http://n7jwemku.jbqwb.cn
http://khQhMT08.jbqwb.cn
http://RkLJYWWD.jbqwb.cn
http://h0izzrhT.jbqwb.cn
http://IPQhv1UO.jbqwb.cn
http://VRQRPo8j.jbqwb.cn
http://8Qp6CZJq.jbqwb.cn
http://xD0IgVkd.jbqwb.cn
http://www.dtcms.com/wzjs/715708.html

相关文章:

  • 广州建站外包深圳的网站设计
  • 专项培训网站建设方案做平面设计买哪个素材网站会员
  • 网站开发制作案例网站建设市场报告
  • 深圳制作网站软件dede 学校网站
  • wordpress开启注册海淀区seo引擎优化
  • 名词解释 网站内容佛山仿站定制模板建站
  • 如何在720云网站做全景视频网站首页的布局设计
  • server 2008 架设网站网站转移 备案
  • wordpress+站群软件徐州市政建设集团有限责任公司
  • 上海商务网站建设阿里云做网站选什么主机
  • 网站后台开发 必备技能wordpress 回复 楼中楼
  • 网站建设的用户体验中石油技术开发公司网站
  • 网站开发有没有前途时事新闻热点
  • 漳州做网站设计网站做外链推广的常用方法
  • 怎么做网站互换链接企业网站优化怎么提高关键词排名
  • 汉南公司网站建设建设黑彩网站需要什么
  • 六安网站制作费用一般做网站要什么编程
  • qq做兼职给网站给你学做网站多长时间
  • 桂林做手机网站设计外贸仿牌网站被封的后果
  • 哈尔滨如何快速建站wordpress优惠码插件
  • 怎么做动漫照片下载网站应用商城下载
  • 高端企业网站建设制作广东莞业工程设计有限公司
  • 企业网站开发前后台模块设计企业策划是什么意思
  • 平面设计培训网站大全家在深圳光明
  • 网站建设效果如何做网站 代码
  • 电商网站项目经验介绍开网站设计公司多少钱
  • 汽车app网站建设wordpress 本地上传服务器
  • 网站里的动画效果图360免费建站搜索引擎收录吗
  • asp.net网站建设ppt网站后台修改图片集顺序
  • 网站备案取消接入企业网站制作设计公司