Vés al contingut

Abstract factory

De la Viquipèdia, l'enciclopèdia lliure

El patró de disseny Abstract factory és un patró de disseny d'enginyeria de programari que proporciona una manera de crear famílies d'objectes relacionats sense imposar les seves classes concretes, encapsulant un grup de fàbriques individuals que tenen un tema comú sense especificar les seves classes concretes.[1]

Estructura

[modifica]

El diagrama de classes és el següent:

Diagrama UML

En Lepus3 Model en LePUS3

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.

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

Referències

[modifica]
  1. Freeman, Eric; Robson, Elisabeth; Sierra, Kathy; Bates, Bert. Head First Design Patterns (paperback) (en anglès). 1. O'REILLY, 2004, p. 156. ISBN 978-0-596-00712-6 [Consulta: 12 setembre 2012]. 

Enllaços externs

[modifica]
  • Abstract Factory (anglès)