Python的创建型设计模式之建造者模式
来源:互联网 发布:统计局报表怎么填数据 编辑:程序博客网 时间:2024/05/24 15:37
书上说此模式和前面的抽象工厂模式相似,它不仅提供了创建复杂对象所需的方法,而且还保存了对象里各部分的细节。
个人觉得,抽象工厂里面因为包含了类中嵌套类的模式,就没有那么像父子类的模式,在看了建造者模式之后,觉得这个才真的很类似于父子类的模式。
再借用书上的话:尤其适用于需要把复杂对象各部分的细节与其创建流程相分离的场合。
现在是要用HTML和TKinter完成一个表单的创建,来看看部分事例代码:
1.首先是一个只能用作抽象基类的类,里面包括了添加表单,标题,内容等等方法
class AbstractFormBuilder(metaclass=abc.ABCMeta): @abc.abstractmethod def add_title(self, title): pass @abc.abstractmethod def form(self): pass @abc.abstractmethod def add_label(self, text, row, column, **kwargs): pass ...2.html下完成表单的类,在继承AbstractFormBuilder的基础上完成具体方法
class HtmlFormBuilder(AbstractFormBuilder): def __init__(self): self.title = "HtmlFormBuilder" self.items = {} def add_title(self, title): pass def add_label(self, text, row, column, **kwargs): self.items[(row, column)] = ('<td><label for="{}":</label></td>')\ .format(kwargs["target"], xml.sax.saxutils.escape(text)) def form(self): html = ["<!doctype html>\n<html><head><title>{}</title></head>" "body".format(self.title), '<form><table border="0">'] thisRow = None for key, value in sorted(self.items.items()): row, column = key if thisRow is None: html.append(" <tr>") elif thisRow != row: html.append(" </tr>\n <tr>") thisRow = row html.append(" " + value) html.append("</tr>") return "\n".join(html) ...
3.tkinter下完成表单的类
class TkFormBuilder(AbstractFormBuilder): def __init__(self): self.title = "TkFormHtml" self.statements = [] def add_title(self, title): pass def add_label(self, text, row, column, **kwargs): name = self._canonicalize(text) create = """self.{}Label = ttk.Label(self, text="{}:")""".format(name, text) layout = """self.{}Label.grid(row={}, column={}, sticky=tk.W)""".format(name, row, column) self.statements.append((create, layout)) TEMPLATE = """创建表单的代码,使用到了tkinter""" def form(self): return TkFormBuilder.TEMPLATE.format(title=self.title, name=self._canonicalize(self.title, False), statements="\n ".join(self.statements)) def _canonicalize(self, text, startLower=True): text = re.sub(r"\W", "", text) if text[0].isdigit(): return "_" + text return text if not startLower else text[0].lower() + text[1:]
盖楼房,也就是这个道理吧。有根基和大致布局,才能去具体完成。
0 0
- Python的创建型设计模式之建造者模式
- 设计模式之创建型模式---建造者模式
- Java设计模式之创建型模式--建造者模式
- python创建型设计模式——建造者模式
- 设计模式(创建型)之建造者模式(Builder Pattern)
- 设计模式-创建型之建造者模式
- 建造者模式——设计模式之创建型
- 创建型设计模式-建造者模式
- 设计模式 创建模式之建造模式
- java 设计模式-创建模式之建造者模式
- JAVA设计模式创建型模式之建造模式
- 创建型模式之建造者模式
- 创建型模式之建造者模式
- 创建型模式之建造者模式
- 创建型模式之建造者模式
- python设计模式之建造者
- 【JavaScript设计模式】创建型设计模式--建造者模式
- 设计模式之建造者模式(生成器模式)(Builder) 创建型模式
- 单例模式的八种写法比较
- Dlib 实现人脸的68点检测
- 老哥稳,如何优雅的解决SSD的写入放大问题
- 14.Selenium2 自动化测试实战-基于Python语言-多窗口切换
- 1.3 Go 命令
- Python的创建型设计模式之建造者模式
- Hive SQL优化
- 2016年大数据80篇爆款文章:这一年你追过的那些技术
- .net项目技术选型总结
- 欢迎使用CSDN-markdown编辑器
- 用Oracle的函数,判断点是否在多边形内
- for update 数据库锁机制(mysql下测试)
- bzoj 4402 Claris的剑 组合数学
- GitHub查找优秀的开源项目和一些资源福利