Fabriksmetod
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.
Definition
[redigera | redigera wikitext]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 | redigera wikitext]Java
[redigera | redigera wikitext]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 | redigera wikitext]- Design Patterns, den inflytelserika boken om designmönster
- Abstrakt fabriksmönster, ett mönster som ofta implementeras med fabriksmetoder
- Byggare, ett annat skapandemönster
- Mallmetod, ett designmönster som kan anropa fabriksmetoder
Referenser
[redigera | redigera wikitext]- Den här artikeln är helt eller delvis baserad på material från engelskspråkiga Wikipedia.
Fotnoter
[redigera | redigera wikitext]- ^ "Factory Pattern", OODesign.com
- ^ ”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.
- ^ Design Patterns: Elements of Reusable Object-Oriented Software from the Gang Of Four
- ^ 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 | redigera wikitext]- Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. ISBN 0-201-63361-2
- Cox, Brad J.; (1986). Object-oriented programming: an evolutionary approach. Addison-Wesley. ISBN 978-0-201-10393-9
- Cohen, Tal; Gil, Joseph (2007). ”Better Construction with Factories” (PDF). Journal of Object Technology (Bertrand Meyer). http://tal.forum2.org/static/cv/Factories.pdf. Läst 12 mars 2007.
|