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

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

// Abstrakt produktinterface Button {void paint();}// Abstrakt produktinterface Label {void paint();}// Abstrakt fabrikinterface GUIFactory {Button createButton();Label createLabel();}// Konkret fabrikclass WinFactory implements GUIFactory {public Button createButton() {return new WinButton();}public Label createLabel() {return new WinLabel();}}// Konkret fabrikclass OSXFactory implements GUIFactory {public Button createButton() {return new OSXButton();}public Label createLabel() {return new OSXLabel();}}// Konkret produktclass OSXButton implements Button {public void paint() {System.out.println("I'm an OSXButton");}}// Konkret produktclass WinButton implements Button {public void paint() {System.out.println("I'm a WinButton");}}// Konkret produktclass OSXLabel implements Label {public void paint() {System.out.println("I'm an OSXLabel");}}// Konkret produktclass 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();elsereturn new OSXFactory();}}

Se även

Referenser

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

Noter

Externa länkar