Fabriksmetod

designmönster inom programmering

Inom klassbaserad programmering är fabriksmetod (factory method på engelska) ett designmönster som använder fabriksmetoder för att hantera problemet med att skapa objekt utan att ange den exakta klassen för objektet som ska skapas. Detta görs genom att skapa objekt genom att anropa en fabriksmetod—som antingen anges i ett gränssnitt och implementeras av underklasser eller implementeras i en basklass och skrivs över av deriverade klasser—istället för att anropa en konstruktor.

UML-diagram av en fabriksmetod

Definition redigera

Fabriksmetoden bör inte blandas ihop med de mer allmänna begreppen fabriker och fabriksmetoder. Mer grundläggande användningsområden av fabriker är inte exempel på fabriksmetoden, och kan istället hänvisas som fabriksmönstret[1] eller en enkel fabrik.[2]

Fabriksmetoden låter en klass senarelägga instansieringar till underklasser.[3]

Att skapa ett objekt kräver ofta komplexa processer som inte är lämpliga att inkludera i ett objekt som skapas. När objekt skapas kan det leda till att kod dupliceras, vilket kanske kräver information som inte finns tillgänglig för det skapade objektet, som kanske inte ger en tillräcklig abstraktionsnivå, eller kanske annars inte berör det skapade objektet. Fabriksmetoden hanterar dessa problem genom att ange en separat metod för att skapa objekten, som underklasser sedan kan skriva över för att ange deriveringstypen till produkten som ska skapas.

Fabriksmetoden förlitar sig på arv, då underklasser som implementerar fabriksmetoden överlåts till att skapa objekt.[4]

Exempel redigera

Java redigera

Ett labyrintspel kan spelas i två lägen, ett med vanliga rum som endast är anslutna till angränsande rum, och en med magiska rum som låter spelaren förflyttas på måfå (detta exempel i Java liknar det som finns i boken Design Patterns). Det vanliga spelläget skulle kunna använda denna mallmetod:

public class MazeGame {
    public MazeGame() {
        Room room1 = makeRoom();
        Room room2 = makeRoom();
        room1.connect(room2);
        this.addRoom(room1);
        this.addRoom(room2);
    }

    protected Room makeRoom() {
        return new OrdinaryRoom();
    }
}

I koden ovan är konstruktorn MazeGame en mallmetod. Den hänvisar till fabriksmetoden makeRoom som kapslar in rumskaparen så att andra rum kan användas i en underklass. För att implementera det andra spelläget som har magiska rum behöver metoden makeRoom skrivas över:

public class MagicMazeGame extends MazeGame {
    @Override
    protected Room makeRoom() {
        return new MagicRoom(); 
    }
}

Se även redigera

Referenser redigera

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

Fotnoter redigera

  1. ^ "Factory Pattern", OODesign.com
  2. ^ ”Chapter 4.”. Arkiverad från originalet den 11 mars 2017. https://web.archive.org/web/20170311165428/http://my.safaribooksonline.com/0596007124/ch04_html. Läst 21 augusti 2015. 
  3. ^ Design Patterns: Elements of Reusable Object-Oriented Software from the Gang Of Four
  4. ^ Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates (2004) (paperback). Head First Design Patterns. "1". O'REILLY. sid. 162. ISBN 978-0-596-00712-6. http://shop.oreilly.com/product/9780596007126.do. Läst 12 september 2012. 

Skrivna referenser redigera