python中的factory method 模式

下图是一个概况图,根据这个图生成代码:


代码清单1:editable.py
class Editable:
""" 个人信息用户界面的公共接口 """
# 获得个人信息编辑界面
def getEditor(self):
pass

代码清单2:editor.py
class Editor:
""" 用户使用特定的Editor来编辑个人信息 """
# 获取代表用户界面(UI)的对象
def getUI(self):
pass

# 获取用户输入的数据
def getContent(self):
pass
# 提交用户输入的数据
def commitChanges(self):
pass

# 清空用户输入的数据
def resetUI(self):
pass

代码清单3:editableaddress.py
from editor import Editor
from editable import Editable
import Tkinter
class EditableAddress(Editable):
""" 用于处理个人地址信息的Editable """

# 构造函数
def __init__(self, master):
self.master = master
self.name = ""
self.province = ""
self.city = ""
self.street = ""
self.zipcode = ""
self.editor = AddressEditor(self)

# 获取相关联的Editor
def getEditor(self):
return self.editor


class AddressEditor(Editor, Tkinter.Frame):
""" 用于处理个人地址信息的Editor """

# 构造函数
def __init__(self, owner):
Tkinter.Frame.__init__(self, owner.master)
self.owner = owner
self.name = Tkinter.StringVar()
self.province = Tkinter.StringVar()
self.city = Tkinter.StringVar()
self.street = Tkinter.StringVar()
self.zipcode = Tkinter.StringVar()
self.createWidgets()

# 构造用户界面
def createWidgets(self):
# 姓名
nameFrame = Tkinter.Frame(self)
nameLabel = Tkinter.Label(nameFrame, text="Name:")
nameEntry = Tkinter.Entry(nameFrame, textvariable=self.name)
nameLabel.config(anchor=Tkinter.E, width=8, pady=3)
nameLabel.pack(side=Tkinter.LEFT)
nameEntry.pack(side=Tkinter.LEFT)
nameFrame.pack()

# 省份
provinceFrame = Tkinter.Frame(self)
provinceLabel = Tkinter.Label(provinceFrame, text="Province:")
provinceEntry = Tkinter.Entry(provinceFrame, textvariable=self.province)
provinceLabel.config(anchor=Tkinter.E, width=8, pady=3)
provinceLabel.pack(side=Tkinter.LEFT)
provinceEntry.pack(side=Tkinter.LEFT)
provinceFrame.pack()
# 城市
cityFrame = Tkinter.Frame(self)
cityLabel = Tkinter.Label(cityFrame, text="City:")
cityEntry = Tkinter.Entry(cityFrame, textvariable=self.city)
cityLabel.config(anchor=Tkinter.E, width=8, pady=3)
cityLabel.pack(side=Tkinter.LEFT)
cityEntry.pack(side=Tkinter.LEFT)
cityFrame.pack()

# 街道
streetFrame = Tkinter.Frame(self)
streetLabel = Tkinter.Label(streetFrame, text="Street:")
streetEntry = Tkinter.Entry(streetFrame, textvariable=self.street)
streetLabel.config(anchor=Tkinter.E, width=8, pady=3)
streetLabel.pack(side=Tkinter.LEFT)
streetEntry.pack(side=Tkinter.LEFT)
streetFrame.pack()

# 邮编
zipcodeFrame = Tkinter.Frame(self)
zipcodeLabel = Tkinter.Label(zipcodeFrame, text="ZIP Code:")
zipcodeEntry = Tkinter.Entry(zipcodeFrame, textvariable=self.zipcode)
zipcodeLabel.config(anchor=Tkinter.E, width=8, pady=3)
zipcodeLabel.pack(side=Tkinter.LEFT)
zipcodeEntry.pack(side=Tkinter.LEFT)
zipcodeFrame.pack()

# 重载Editor中的方法,获取代表用户界面(UI)的对象
def getUI(self):
return self

# 重载Editor中的方法,获取用户输入的数据
def getContent(self):
content = " Name: " + self.name.get() + "\n"
content += "Province: " + self.province.get() + "\n"
content += " City: " + self.city.get() + "\n"
content += " Street: " + self.street.get() + "\n"
content += "ZIP Code: " + self.zipcode.get()
return content

# 重载Editor中的方法,提交用户输入的数据
def commitChanges(self):
self.owner.name = self.name.get()
self.owner.province = self.province.get()
self.owner.city = self.city.get()
self.owner.street = self.street.get()
self.owner.zipcode = self.zipcode.get()
# 重载Editor中的方法,清空用户输入的数据
def resetUI(self):
self.name.set("")
self.province.set("")
self.city.set("")
self.street.set("")
self.zipcode.set("")

代码清单5:editablefactory.py
class EditableFactory:
""" 用于创建Editable的工厂类 """

# 实例化Editable对象
def createEditable(self, master):
pass

代码清单6:editableaddressfactory.py
from editablefactory import EditableFactory
from editableaddress import EditableAddress
class EditableAddressFactory(EditableFactory):
""" 用于创建EditableAddress的工厂类 """

# 重载EditableFactory中的方法,实例化EditableAddress对象
def createEditable(self, master):
address = EditableAddress(master)
return address
代码清单7:editablephonefactory.py
from editablefactory import EditableFactory
from editablephone import EditablePhone
class EditablePhoneFactory(EditableFactory):
""" 用于创建EditablePhone的工厂类 """

# 重载EditableFactory中的方法,实例化EditablePhone对象
def createEditable(self, master):
phone = EditablePhone(master)
return phone
代码清单8:pim.py
from editablephone import EditablePhone
from editableaddressfactory import EditableAddressFactory
from editablephonefactory import EditablePhoneFactory
import Tkinter
class PIM:
""" 个人信息管理 """

# 构造函数
def __init__(self):
mainFrame = Tkinter.Frame()
mainFrame.master.title("PIM")
# 命令按钮
addressButton = Tkinter.Button(mainFrame, width=10, text="Address")
phoneButton = Tkinter.Button(mainFrame, width=10, text="Phone")
commitButton = Tkinter.Button(mainFrame, width=10, text="Commit")
resetButton = Tkinter.Button(mainFrame, width=10, text="Reset")
addressButton.config(command=self.addressClicked)
phoneButton.config(command=self.phoneClicked)
commitButton.config(command=self.commitClicked)
resetButton.config(command=self.resetClicked)
addressButton.grid(row=0, column=1, padx=10, pady=5, stick=Tkinter.E)
phoneButton.grid(row=1, column=1, padx=10, pady=5, stick=Tkinter.E)
commitButton.grid(row=2, column=1, padx=10, pady=5, stick=Tkinter.E)
resetButton.grid(row=3, column=1, padx=10, pady=5, stick=Tkinter.E)

# 用来容纳各类Editor的容器
self.editorFrame = Tkinter.Frame(mainFrame)
self.editorFrame.grid(row=0, column=0, rowspan=4)
self.editorFrame.grid_configure(stick=Tkinter.N, pady=15)
self.editor = Tkinter.Frame(self.editorFrame)
self.editor.grid()

# 个人信息显示区域
self.content = Tkinter.StringVar()
self.contentLabel = Tkinter.Label(mainFrame, width=50, height=5)
self.contentLabel.configure(textvariable=self.content)
self.contentLabel.configure(anchor=Tkinter.W, font="Arial 10 italic bold")
self.contentLabel.configure(relief=Tkinter.RIDGE, pady=5, padx=10)
self.contentLabel.grid(row=4, column=0, columnspan=2)

mainFrame.pack()
mainFrame.mainloop()

# Address按钮的回调函数
def addressClicked(self):
address = EditableAddressFactory().createEditable(self.editorFrame)
self.editor.grid_remove()
self.editor = address.getEditor()
self.editor.getUI().grid()
# Phone按钮的回调函数
def phoneClicked(self):
phone = EditablePhoneFactory().createEditable(self.editorFrame)
self.editor.grid_remove()
self.editor = phone.getEditor()
self.editor.getUI().grid()

# Commit按钮的回调函数
def commitClicked(self):
content = self.editor.getContent()
self.content.set(content)

# Reset按钮的回调函数
def resetClicked(self):
self.editor.resetUI()

# 主函数
if (__name__ == "__main__"):
app = PIM()


posted @ 2011-02-24 15:35  Charliee  阅读(1703)  评论(0编辑  收藏  举报