Gå til innhold

Hva er den høyere mening med Factory pattern?


Anbefalte innlegg

Kikket over noe greier i Gang of four boka, og jeg har vært borti factory pattern før, men jeg har aldri sett helt vitsen. kanskje fordi jeg ikke når en viss prosjektstørrelse... men la oss ta de meget brukte pizza eksemplene.

 

man definerer et par klasser:

 

Pizza

Peperoni : Pizza

TrippelOst : Pizza

Biff : Pizza

 

og i selve fabrikken:

 

Pizza CreatePizza( PizzaType type )
swtich type
return pizza

 

bruken:

 

Pizza* p = PizzaFactory::CreatePizza( PizzaType.Biff )

 

men hvorfor alt dette maset når jeg kunne bare ha gjort

 

Pizza* p = new Biff()

 

??

Lenke til kommentar
Videoannonse
Annonse

Factories for å konstruere objekter er ganske viktig i det du må skrive kode som ikke bryr seg om hvilket objekt som lages.

Dette skjer typisk når du får data (som leses fra database,fil eller nettverk) som sier hvilket objekt som skal lages.

 

Ex

class Ost : public Matvare {} ...

class Kjøtt : public Matvare {} ...

 

Si du har en fil som beskriver en handleliste som feks ser noe slikt ut:

(Nytt entry på hver linje, resten av linja er data spesifikt for mattypen)

Ost Brun

Kjøtt Biff dypfryst

 

Når du da leser inn fra fila

ifstream handleliste("fil.txt");
while (!handleliste.eof())
{
 std::string type;
 ifstream >> type;
 Matvare* matvare = Matvare::CreateFood(type);
 std::string matData;
 getline(handleliste, matData);
 matvare->SetData(matData);  // parser dataen og gjør den meningsfull for denne typen mat.
}

 

 

 

Kom på et litt mer beskrivende eksempel som jeg kan oppsummere i noen få setninger.

 

Tenk deg at du lager et spill, der du har 2 forskjellig typer beveglige objekter som beveger seg på en server. Disse skal sendes til spillerene (clientene). Hvordan skal spillerene klare å lage riktig objekt ut i fra datastrømmen du sender dem? Hva skjer om serveren plutselig har 1000 forskjellige objekter? ser du at det her kan være praktisk med en factory?

Lenke til kommentar

ifstream handleliste("fil.txt");
while (!handleliste.eof())
{
 std::string type;
 ifstream >> type;
 // ...
}

 

Veeeeldig avsporing, men det frarådes på det sterkeste å lese data inn på denne måten. EOF trenger ikke å være satt før etter et forsøk på å lese forbi slutten.

Endret av zotbar1234
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...