Abstract factory
De Viquipèdia
El patró de disseny Abstract factory permet crear diferents famílies d'objectes.
Taula de continguts |
Estructura [modifica]
El diagrama de classes és el següent:
Codis d'exemple [modifica]
Java [modifica]
/* GUIFactory example -- */ interface GUIFactory { public Button createButton(); } class WinFactory implements GUIFactory { public Button createButton() { return new WinButton(); } } class OSXFactory implements GUIFactory { public Button createButton() { return new OSXButton(); } } interface Button { public void paint(); } class WinButton implements Button { public void paint() { System.out.println("I'm a WinButton"); } } class OSXButton implements Button { public void paint() { System.out.println("I'm an OSXButton"); } } class Application { public Application(GUIFactory factory){ Button button = factory.createButton(); button.paint(); } } public class ApplicationRunner { public static void main(String[] args) { new Application(createOsSpecificFactory()); } public static GUIFactory createOsSpecificFactory() { int sys = readFromConfigFile("OS_TYPE"); if (sys == 0) { return new WinFactory(); } else { return new OSXFactory(); } } }
La sortida del programa hauria de ser "I'm a WinButton" o "I'm a OSXButton" depenent del tipus de factoria usat. Tingueu en compte que l'aplicació no té ni idea de quin tipus de GUIFactory es dóna, o fins i tot quin tipus de botó que genera la fàbrica.
C++ [modifica]
/* a GUIFactory exemple en C++ */ struct GUIFactory{ virtual Button* createButton () = 0; }; struct WinGUIFactory : public GUIFactory{ Button* createButton (){ return new WinButton(); } }; struct OSXGUIFactory : public GUIFactory{ Button* createButton (){ return new OSXButton(); } }; struct Button{ virtual void paint() = 0; }; struct WinButton : public Button{ void paint (){ std::cout << " I'm a window button \n"; } }; struct OSXButton : public Button{ void paint (){ std::cout << " I'm a OSX button \n"; } }; struct Application { Application(GUIFactory* factory){ Button * button = factory->createButton(); button->paint(); } }; /* application code */ int main() { GUIFactory* factory1 = new WinFactory(); GUIFactory* factory2 = new OSXFactory(); Application* winApp = new Application (factory1); Application* osxApp = new Application (factory2); delete factory1, factory2; return 0; }
Enllaços externs [modifica]
- Abstract Factory (anglès)
- Abstract Factory (anglès)
- Abstract Factory on the Net Objectives Repository (anglès)
- Jt J2EE Pattern Oriented Framework (anglès)
- C++ Abstract Factory C++ abstract factory design and tutorial (anglès)
|
|||||||||||

