Abstrakt fabrik

Från Wikipedia
Hoppa till: navigering, sök

Abstrakt fabrik (från engelskans abstract factory) är ett begrepp inom programmering. En abstrakt fabrik är ett designmönster som ger ett sätt att kapsla in en grupp individuella fabriker som har ett gemensamt tema utan att ange dess konkreta klasser.[1] Klientprogrammet skapar en konkret implementation av den abstrakta fabriken och sedan använder fabrikens gränssnitt för att skapa de konkreta objekten som är del av temat. Klienten vet inte vilka konkreta objekt den får från varje intern fabrik, då den endast använder produkternas gränssnitt.[1] Detta mönster separerar detaljerna för implementationen av ett antal objekt från deras allmänna användning och förlitar sig på objektkomposition, då objektskapande implementeras i metoder som finns i fabrikens gränssnitt.[1]

En fabrik är placeringen av en konkret klass i koden där objekt skapas. Avsikten att använda mönstret är att isolera skapandet av föremål från deras användning och för att skapa familjer av relaterade objekt utan att behöva vara beroende av deras konkreta klasser.[1] Detta låter nya deriverade typer att skapas utan att ändra koden som använder basklassen.

Definition[redigera | redigera wikitext]

Abstrakt fabrik står för att "ange ett gränssnitt för att skapa familjer av relaterade eller oberoende objekt utan att ange deras konkreta klasser".[2]

Exempel i Java[redigera | redigera wikitext]

// Abstrakt produkt
interface Button {
	void paint();
}
// Abstrakt produkt
interface Label {
	void paint();
}

// Abstrakt fabrik
interface GUIFactory {
	Button createButton();
	Label createLabel();
}

// Konkret fabrik
class WinFactory implements GUIFactory {
	public Button createButton() {
		return new WinButton();
	}

	public Label createLabel() {
		return new WinLabel();
	}
}

// Konkret fabrik
class OSXFactory implements GUIFactory {
	public Button createButton() {
		return new OSXButton();
	}

	public Label createLabel() {
		return new OSXLabel();
	}

}

// Konkret produkt
class OSXButton implements Button {
	public void paint() {
		System.out.println("I'm an OSXButton");
	}
}

// Konkret produkt
class WinButton implements Button {
	public void paint() {
		System.out.println("I'm a WinButton");
	}
}

// Konkret produkt
class OSXLabel implements Label {
	public void paint() {
		System.out.println("I'm an OSXLabel");
	}
}

// Konkret produkt
class WinLabel implements Label {
	public void paint() {
		System.out.println("I'm a WinLabel");
	}
}

// Klientapplikationen är inte medveten om hur produkterna skapas.
class Application {
	public Application(GUIFactory factory) {
		Button button = factory.createButton();
		Label label = factory.createLabel();
		button.paint();
		label.paint();
	}
}

public class ApplicationRunner {
	public static void main(String[] args) {
		new Application(createOsSpecificFactory());
	}

	public static GUIFactory createOsSpecificFactory() {
		String osname = System.getProperty("os.name").toLowerCase();
		if(osname != null && osname.contains("windows"))
			return new WinFactory();
		else
			return new OSXFactory();
	}
}

Se även[redigera | redigera wikitext]

Referenser[redigera | redigera wikitext]

Den här artikeln är helt eller delvis baserad på material från engelskspråkiga Wikipedia

Noter[redigera | redigera wikitext]

  1. ^ [a b c d] Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates (2004).
  2. ^ Gamma, Erich; Richard Helm; Ralph Johnson; John M. Vlissides (2009-10-23).

Externa länkar[redigera | redigera wikitext]