Factory-metoden är ett skapande designmönster, dvs. relaterat till objektskapande. I fabriksmönster skapar vi objekt utan att exponera skapelselogiken för klienten och klienten använder samma gemensamma gränssnitt för att skapa ny typ av objekt.
Tanken är att använda en statisk medlemsfunktion (statisk fabriksmetod) som skapar & returnerar instanser, döljer detaljerna i klassmodulerna för användaren.
Ett fabriksmönster är en av de grundläggande designprinciperna för att skapa ett objekt, så att klienter kan skapa objekt i ett bibliotek (förklaras nedan) på ett sådant sätt att det inte har en tät koppling till biblioteks klasshierarki.
Vad menas när vi pratar om bibliotek och klienter?
Ett bibliotek är något som tillhandahålls av någon tredje part som exponerar några offentliga API: er och klienter ringer till de offentliga API: erna för att slutföra sin uppgift. Ett mycket enkelt exempel kan vara olika typer av vyer som tillhandahålls av Android OS.
Varför fabriksmönster?
Låt oss förstå det med ett exempel:
Output:
I am two wheeler
Vilka är problemen med ovanstående design?
Som du måste ha observerat i exemplet ovan skapar klienten objekt från antingen TwoWheeler eller FourWheeler baserat på en del input under konstruktionen av dess objekt.
Säg, biblioteket introducerar en ny klass ThreeWheeler för att även inkludera trehjuliga fordon. Vad skulle hända? Kunden kommer att sluta kedja en ny annan om den är i den villkorliga stegen för att skapa objekt från ThreeWheeler. Vilket i sin tur kommer att kräva att klienten kompileras om. Så varje gång en ny ändring görs på bibliotekssidan måste klienten göra några motsvarande ändringar i slutet och kompilera om koden. Låter illa? Detta är en mycket dålig designutövning.
Hur undviker man problemet?
Svaret är att skapa en statisk (eller fabriks) metod. Låt oss se koden nedan.
Output:
I am three wheeler
I exemplet ovan har vi helt frikopplat valet av typ för objektskapande från klienten. Biblioteket ansvarar nu för att bestämma vilken objekttyp som ska skapas baserat på en inmatning. Klienten behöver bara ringa till biblioteksfabrikens Skapa-metod och skicka den typ som den vill utan att oroa sig för den faktiska implementeringen av skapandet av objekt.
Tack till Rumplestiltskin för att ge ovanstående förklaring.
Andra exempel på fabriksmetod:
- Säg, i ett ”Ritningssystem”, beroende på användarens inmatning, kan olika bilder som fyrkant, rektangel, cirkel ritas. Här kan vi använda fabriksmetoden för att skapa instanser beroende på användarens inmatning. För att lägga till en ny typ av form behöver du inte ändra klientkod.
- Ett annat exempel: På resesidan kan vi boka tågbiljett samt bussbiljetter och flygbiljett. I det här fallet kan användaren ange sin restyp som ’buss’, ’tåg’ eller ’flyg’.
Här har vi en abstrakt klass ’AnyTravel’ med en statisk medlemsfunktion ’GetObject’ som beroende på användarens restyp kommer att skapa & returobjekt för ’BusTravel’ eller ’TrainTravel’. ”BusTravel” eller ”TrainTravel” har vanliga funktioner som passagerarnamn, Ursprung, destinationsparametrar.
Tack till Abhijit Saha som ger de två första exemplen.