sábado, 20 de septiembre de 2008

PATRONES CREACIONALES (II). Patrón Abstract Factory


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: