El patrón de diseño Abstract Factory se utiliza para crear diferentes familias de productos.
Pudiéndose añadir nuevas familias en un futuro.
A continuación, presentamos un ejemplo típico del patrón Abstract Factory para la creación
de ventanas y botones en dos entornos gráficos diferentes WxWindows y Tkinter. Como hemos comentado
anteriormente este patrón está especialmente indicado cuando pueden aparecer nuevas familias
a las cuales dar soporte. En nuestro ejemplo, el caso típico sería incluir una nueva librería
gráfica como pyGTK.
#Abstract Factory Implementation
import Tkinter
import wx
class AbstractFactory(object):
app = None
def getFactory(self, library):
return {'Tkinter': TkinterFactory(), 'Wx': WxFactory()}[library]
def createApp(self):
raise NotImplementedError
def createWindow(self, parent,title):
raise NotImplementedError
def createButton(self, parent,title):
raise NotImplementedError
class TkinterFactory(AbstractFactory):
def createApp(self):
self.app = Tkinter.Tk()
return self.app
def createWindow(self, parent,title):
return TkinterWindow().createWindow(parent, title)
def createButton(self, parent,title):
return TkinterButton().createButton(parent, title)
def run(self):
self.app.mainloop()
class WxFactory(AbstractFactory):
def createApp(self):
self.app = wx.PySimpleApp()
return self.app
def createWindow(self, parent,title):
return WxWindow().createWindow(parent, title)
def createButton(self, parent,title):
return WxButton().createButton(parent, title)
def run(self):
self.app.MainLoop()
class AbstractWindow(object):
hnd = None
def createWindow(self, parent,title):
pass
class TkinterWindow(AbstractWindow):
def createWindow(self, parent,title):
self.hnd = Tkinter.Frame(parent)
parent.title(title)
self.hnd.pack()
return self.hnd
class WxWindow(AbstractWindow):
def createWindow(self, parent, title):
self.hnd = wx.Frame(None, -1 , "Hola")
self.hnd.Show(True)
return self.hnd
class AbstractButton(object):
def __init__(self):
self.button = None
self.title = None
def createButton(self):
pass
class TkinterButton(AbstractButton):
def createButton(self,parent, title):
self.button = Tkinter.Button(text=title).pack(side=Tkinter.BOTTOM)
class WxButton(AbstractButton):
def createButton(self,parent, title):
self.button = wx.Button(parent, -1, title)
w = AbstractFactory()
f = w.getFactory('Wx')
a = f.createApp()
b = f.createWindow(a,"Hola")
f.createButton(b, "Hola")
f.run()
No hay comentarios:
Publicar un comentario