Da jeg endelig er begyndt for alvor at prøve at lære nogle grundlæggende mønstre (meget sent i karrieren, men det er en anden historie), prøver jeg at få min gå rundt om forskellene mellem fabriksmønsteret og abstrakt fabrik.

Hvad er de vigtigste forskelle mellem disse to mønstre?

Jeg forstår, at fabriksmetoden skaber objekter gennem arv, og abstrakt fabrik gør det gennem objektsammensætning, men fra et praktisk synspunkt har jeg stadig problemer med at visualisere nøjagtigt, hvordan de hver fungerer.

Kommentarer

  • stackoverflow.com/questions/1001767/…
  • For at afklare mener du " Fabriksmetode " når du siger " Fabriksmønster "? Hvis du taler om Gang of Four mønstre, er der intet fabriksmønster, men der er abstrakt faktor y og fabriksmetode.
  • Ja – fabriksmetode.
  • For at være retfærdig synes de to sætninger at være temmelig almindeligt udskiftede.
  • Ah, fabriksmetode. En løsning på det faktum, at new ikke er ' ta-metode (i nogle – ganske vist almindelige – objektsystemer).

Svar

Fabriksmetode er normalt kategoriseret efter en switch-erklæring, hvor hver sag returnerer en anden klasse ved hjælp af den samme rodgrænseflade, så opkaldskoden aldrig behøver at træffe beslutninger om implementeringen.

Tænk på en fabriksbetaling med kreditkort der returnerer en anden validator for hver korttype.

public ICardValidator GetCardValidator (string cardType) { switch (cardType.ToLower()) { case "visa": return new VisaCardValidator(); case "mastercard": case "ecmc": return new MastercardValidator(); default: throw new CreditCardTypeException("Do not recognise this type"); } } 

Abstrakt fabrik er, hvor du har flere konkrete fabriksklasser (ikke fabriksmetoder) afledt af en grænseflade, der kan returnere mange forskellige typer fra forskellige metoder.

Tænk på en skakspilmanager med en anden klasse for hvert sæt variantregler.

public class StandardChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new StandardChessBoardMapper(); } public IKingMover GetKingMover() { return new StandardChessKingMover(); } public IMoveClock GetMoveClock() { return new StandardMoveClock(); } } public class HexagonalChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new HexagonalChessBoardMapper(); } public IKingMover GetKingMover() { return new HexagonalChessKingMover(); } public IMoveClock GetMoveClock() { return new StandardMoveClock(); } } public class SpeedChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new StandardChessBoardMapper(); } public IKingMover GetKingMover() { return new StandardChessKingMover(); } public IMoveClock GetMoveClock() { return new SpeedChessMoveClock(); } } 

En abstrakt fabrik , ligesom en strategi, vælges ofte ved hjælp af en fabriksmetode, men det er ikke nødvendigt at kombinere dem, så det er dets eget mønster.

Kommentarer

  • Er denne forklaring på fabriksmetoden korrekt? Hvad ' handler om " Fabriksmetodemønsteret er afhængig af arv, da oprettelse af objekt delegeres til underklasser som implementer fabriksmetoden for at oprette objekter ". Så eksemplet er mere som Static Factory.
  • @ SerG Nå, retfærdigt har du ' hentet citatet fra Wikipedia på en side, der læser meget forskelligt for tre år siden. Jeg vil hævde, at den aktuelle Wikipedia-side modsiger sig selv flere steder, men jeg har ikke ' ikke ønsket om at blive involveret i at vælge det fra hinanden. Hvad jeg med efterfølgende vil indrømme er, at eksemplet, jeg ' har givet her, er en bestemt slags fabriksmetode, kendt som den parametriserede fabriksmetode. Men pointen om forskellen mellem fabriksmetode og abstrakt fabrik gælder for alle typer fabriksmetoder.
  • Den samme udsagn som mit citat findes i GoF " Designmønstre ". Og parameteriseret FM er også beskrevet der.
  • Den vigtige del er, at fabrikken giver den, der ringer op, et passende objekt afhængigt af den særlige situation, og den, der ringer, ' t har brug for at vide, hvad nøjagtigt klassen for det objekt er, og behøver ' ikke at vide, hvordan det bestemte objekt blev valgt, så længe objektet understøtter en grænseflade, som opkalder kender til.
  • Du bør angive det klart i dit svar, at dit eksempel ikke er et typisk fabriksmetodemønster, men en eller anden specialisering, der hedder parametreret fabriksmetode. Og skriv om definitionen af den typiske fabriksmetode, fordi den er vildledende lige nu. Jeg lærte bare om fabriksmetodemønster, jeg forstod alt, og så læste jeg det svar, der viser fabriksmetodemønster som noget andet, og jeg var forvirret. Der er ingen oplysninger om, at eksemplet ikke er et typisk fabriksmetodemønster. Tak til SerG for at henvise til det i kommentaren.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *