När jag äntligen börjat på allvar försöka lära mig några grundläggande mönster (mycket sent i karriären, men det är en annan historia), försöker jag få min gå runt skillnaderna mellan fabriksmönstret och abstraktfabriken.

Vilka är de viktigaste skillnaderna mellan dessa två mönster?

Jag förstår att fabriksmetoden skapar objekt genom arv och abstrakt fabrik gör det genom objektsammansättning, men ur praktisk synvinkel har jag fortfarande problem med att visualisera exakt hur de fungerar.

Kommentarer

  • stackoverflow.com/questions/1001767/…
  • För att klargöra menar du " Fabriksmetod " när du säger " Fabriksmönster "? Om du pratar om Gang of Four-mönster finns det inget fabriksmönster, men det finns abstrakt faktor y och fabriksmetoden.
  • Ja – fabriksmetod.
  • För att vara rättvis verkar de två fraserna vara ganska vanliga.
  • Ah, fabriksmetod. En lösning för att new inte är ' ta-metoden (i vissa – visserligen vanliga – objektsystem).

Svar

Fabriksmetod kategoriseras vanligtvis av ett switch-uttalande där varje fall returnerar en annan klass, med samma rotgränssnitt så att ringkoden aldrig behöver fatta beslut om implementeringen.

Tänk på en kreditkortsvalideringsfabrik som returnerar en annan validerare för varje korttyp.

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 är där du har flera konkreta fabriksklasser (inte fabriksmetoder) härledda från ett gränssnitt som kan returnera många olika typer från olika metoder.

Tänk på en schackspelschef med en annan klass för varje uppsättning 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 , precis som en strategi, väljs ofta med en fabriksmetod, men det är inte nödvändigt att kombinera dem så att det är ett eget mönster.

Kommentarer

  • Är den förklaringen av fabriksmetoden korrekt? Vad ' handlar om " Fabriksmetodsmönstret är beroende av arv, eftersom skapande av objekt delegeras till underklasser som implementera fabriksmetoden för att skapa objekt ". Så exemplet är mer som Static Factory.
  • @ SerG Nåväl, rättvist, du ' har plockat upp citatet från Wikipedia på en sida som läser väldigt mycket annorlunda för tre år sedan. Jag skulle hävda att den nuvarande Wikipedia-sidan motsäger sig själv på flera ställen, men jag har inte ' inte önskan att bli involverad i att plocka isär det. Vad jag i efterhand skulle erkänna är att exemplet jag ' har tillhandahållit här är en specifik typ av fabriksmetod, känd som den parametrerade fabriksmetoden. Men poängen om skillnaden mellan Factory Method och Abstract Factory gäller för alla typer av Factory Method.
  • Samma uttalande som mitt citat finns i GoF " Designmönster ". Och parametrerad FM beskrivs också där.
  • Den viktiga delen är att fabriken ger den som ringer ett lämpligt objekt, beroende på den specifika situationen, och den som ringer inte ' t behöver veta exakt vilken klass det objektet har, och behöver inte ' veta hur det specifika objektet valdes, så länge objektet stöder ett gränssnitt som ringer känner till.
  • Du bör ange det tydligt i ditt svar att ditt exempel inte är ett typiskt fabriksmetodsmönster, utan någon specialisering som heter parametrerad fabriksmetod. Och skriv om definitionen av en typisk fabriksmetod, för den är missvisande just nu. Jag lärde mig bara om fabriksmetodsmönster, jag förstod allt och sedan läste jag det svaret som visar fabriksmetodsmönster som något annat och jag var förvirrad. Det finns ingen information om att exemplet inte är typiskt fabriksmetodsmönster. Tack till SerG för att peka ut det i kommentaren.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *