書上說此模式和前面的抽象工廠模式相似,它不僅提供了創建複雜對象所需的方法,而且還保存了對象裏各部分的細節。
個人覺得,抽象工廠裏面因爲包含了類中嵌套類的模式,就沒有那麼像父子類的模式,在看了建造者模式之後,覺得這個才真的很類似於父子類的模式。
再借用書上的話:尤其適用於需要把複雜對象各部分的細節與其創建流程相分離的場合。
現在是要用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:]
蓋樓房,也就是這個道理吧。有根基和大致佈局,才能去具體完成。