python设计模式(2)-Abstract Factory(抽象工厂)

Abstract Factory模式,将具体的产品封装在具体Factory实现中,而客户只需要和Factory以及产品的抽象界面打交道,避免依赖于具体的Factory与产品,由于Factory封装了所有产品细节,所以要更换掉所有的组件,只要简单的抽换掉Factory就可以 了,不用修改客户端。例如,要制作一个跨平台的窗口程序,窗口由一系列控件组成,比如菜单,工具栏,按钮,滚动条等。为简化起见,设这个窗口只有菜单和工具栏。则程序如下:

#Abstract Factory-抽象工厂模式 class CClientWindow(object): """客户端窗口,代表客户端""" def __init__(self,ctrlfactory): self.SetCtrlFactory(ctrlfactory) def SetCtrlFactory(self,ctrlfactory): self.m_CtrlFactory=ctrlfactory self.SetMenu(self.m_CtrlFactory.GetMenu()) self.SetToolBar(self.m_CtrlFactory.GetToolBar()) def SetMenu(self,menu): self.m_Menu=menu def SetToolBar(self,toolbar): self.m_ToolBar=toolbar def ShowWindow(self): self.m_Menu.ShowMenu() self.m_ToolBar.ShowToolBar() class CMenu(object): """抽象菜单""" def ShowMenu(self): pass class CWindowsMenu(CMenu): """具体菜单,用于Windows系统""" def ShowMenu(self): print 'CWindowsMenu ShowMenu' class CLinuxMenu(CMenu): """具体菜单,用于Linux系统""" def ShowMenu(self): print 'CLinuxMenu ShowMenu' class CToolBar(object): """抽象工具栏""" def ShowToolBar(self): pass class CWindowsToolBar(CToolBar): """具体工具栏,用于Windows系统""" def ShowToolBar(self): print 'CWindowsToolBar ShowToolBar' class CLinuxToolBar(CToolBar): """具体工具栏,用于Linux系统""" def ShowToolBar(self): print 'CLinuxToolBar ShowToolBar' class CCtrlFactory(object): """抽象工厂,用于产生跨平台产生所有窗口控件""" def GetMenu(self): pass def GetToolBar(self): pass class CWindowsCtrlFactory(object): """具体工厂,产生Windows下所需的所有窗口控件""" def GetMenu(self): return CWindowsMenu() def GetToolBar(self): return CWindowsToolBar() class CLinuxCtrlFactory(object): """具体工厂,产生Linux下所需的所有窗口控件""" def GetMenu(self): return CLinuxMenu() def GetToolBar(self): return CLinuxToolBar() #客户程序运行 wnd=CClientWindow(CWindowsCtrlFactory()) wnd.ShowWindow()

 

运行:

CWindowsMenu ShowMenu
CWindowsToolBar ShowToolBar

 

 

Abstract Factory结构图如下:

你可能感兴趣的:(python设计模式(2)-Abstract Factory(抽象工厂))