Abstract factory pattern
维基百科Abstract factory pattern
NOTE: 建议先阅读例子,然后阅读理论描述
Structure
Class diagram example The method createButton
on the GUIFactory
interface returns objects of type Button
. What implementation of Button
is returned depends on which implementation of GUIFactory
is handling the method call.
NOTE: UML图最能够体现abstract factory pattern
Python example
from abc import ABC, abstractmethod
from sys import platform
class Button(ABC):
@abstractmethod
def paint(self):
pass
class LinuxButton(Button):
def paint(self):
return 'Render a button in a Linux style'
class WindowsButton(Button):
def paint(self):
return 'Render a button in a Windows style'
class MacOSButton(Button):
def paint(self):
return 'Render a button in a MacOS style'
class GUIFactory(ABC):
@abstractmethod
def create_button(self):
pass
class LinuxFactory(GUIFactory):
def create_button(self):
return LinuxButton()
class WindowsFactory(GUIFactory):
def create_button(self):
return WindowsButton()
class MacOSFactory(GUIFactory):
def create_button(self):
return MacOSButton()
def GetFactory():
if platform == 'linux':
factory = LinuxFactory()
elif platform == 'darwin':
factory = MacOSFactory()
elif platform == 'win32':
factory = WindowsFactory()
else:
raise NotImplementedError(
'Not implemented for your platform: {}'.format(platform)
)
return factory
if __name__ == '__main__':
factory = GetFactory()
button = factory.create_button()
result = button.paint()
print(result)
Alternative implementation using the classes themselves as factories:
from abc import ABC, abstractmethod
from sys import platform
class Button(ABC):
@abstractmethod
def paint(self):
pass
class LinuxButton(Button):
def paint(self):
return 'Render a button in a Linux style'
class WindowsButton(Button):
def paint(self):
return 'Render a button in a Windows style'
class MacOSButton(Button):
def paint(self):
return 'Render a button in a MacOS style'
def GetFactory():
if platform == "linux":
factory = LinuxButton
elif platform == "darwin":
factory = MacOSButton
elif platform == "win32":
factory = WindowsButton
else:
raise NotImplementedError(
'Not implemented for your platform: {}'.format(platform)
)
if __name__ == '__main__':
factory = GetFactory()
button = factory.create_button()
result = button.paint()
print(result)
NOTE: Everything in python is a object,so do class
下面是上述代码的UML图