Vés al contingut

Abstract factory

De Viki.cat

El patró de disseny Abstract factory permet crear diferents famílies d'objectes.

Estructura

El diagrama de classes és el següent:

Diagrama UML

En Lepus3 (llegenda): Model en LePUS3

Codis d'exemple

Java

<source lang="java">

/* 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();
}
}

}

</source>

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++

<source lang="cpp">

/* 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;

}


</source>



Enllaços externs