Abstract factory
(S'ha redirigit des de: Abstract Factory)
L'article necessita algunes millores en la redacció de la introducció. |
El patró de disseny Abstract factory permet crear diferents famílies d'objectes.
Estructura modifica
El diagrama de classes és el següent:
En Lepus3 (llegenda Arxivat 2018-03-14 a Wayback Machine.):
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 dona, 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 Arxivat 2008-12-06 a Wayback Machine. (anglès)
- Abstract Factory on the Net Objectives Repository Arxivat 2008-09-17 a Wayback Machine. (anglès)
- Jt Arxivat 2008-11-20 a Wayback Machine. J2EE Pattern Oriented Framework (anglès)
- C++ Abstract Factory[Enllaç no actiu] C++ abstract factory design and tutorial (anglès)