Abstrakt fabrik

designmönster inom programmering

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

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

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

Referenser redigera

Den här artikeln är helt eller delvis baserad på material från engelskspråkiga Wikipedia, Abstract factory pattern, 15 augusti 2015.

Noter redigera

  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