Etter å ha endelig begynt å prøve å lære noen grunnleggende mønstre (veldig sent i karrieren, men det er en annen historie), prøver jeg å få gå rundt forskjellene mellom fabrikkmønsteret og abstrakt fabrikk.
Hva er nøkkelforskjellene mellom disse to mønstrene?
Jeg forstår at fabrikkmetoden skaper objekter gjennom arv og abstrakt fabrikk gjør det gjennom objektsammensetning, men fra et praktisk synspunkt har jeg fortsatt problemer med å visualisere nøyaktig hvordan de fungerer.
Kommentarer
Svar
Fabrikkmetode er vanligvis kategorisert etter en bryteruttalelse der hvert tilfelle returnerer en annen klasse, ved hjelp av samme rotgrensesnitt, slik at ringekoden aldri trenger å ta beslutninger om implementeringen.
Tenk på en kredittkortvalideringsfabrikk som returnerer en annen 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 fabrikk er der du har flere konkrete fabrikkklasser (ikke fabrikkmetoder) avledet fra ett grensesnitt som kan returnere mange forskjellige typer fra forskjellige metoder.
Tenk på en sjakkspillleder med en annen klasse for hvert sett med 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 fabrikk , som en strategi, er ofte valgt ved hjelp av en fabrikkmetode, men det er ikke nødvendig å kombinere dem slik at det er sitt eget mønster.
Kommentarer
- Er den forklaringen på Factory-metoden riktig? Hva ' handler om " Fabriksmetodemønsteret er avhengig av arv, da objektoppretting delegeres til underklasser som implementer fabrikkmetoden for å lage objekter ". Så eksemplet er mer som Static Factory.
- @ SerG Vel, i rettferdighet har du ' hentet sitatet fra Wikipedia, på en side som leste veldig annerledes for tre år siden. Jeg vil hevde at den nåværende Wikipedia-siden motsier seg selv flere steder, men jeg har ikke ' t ønske om å bli involvert i å plukke det fra hverandre. Det jeg i ettertid vil innrømme er at eksemplet jeg ' har gitt her er en bestemt type fabrikkmetode, kjent som den parametriserte fabrikkmetoden. Men poenget om forskjellen mellom fabrikkmetode og abstrakt fabrikk holder på alle typer fabrikkmetoder.
- Det samme utsagnet som sitatet eksisterer i GoF " Designmønstre ". Og parameterisert FM er også beskrevet der.
- Den viktige delen er at fabrikken vil gi innringeren et passende objekt, avhengig av den aktuelle situasjonen, og den som ringer ikke ' t trenger å vite hva nøyaktig klassen til det objektet er, og trenger ikke ' å vite hvordan det bestemte objektet ble valgt, så lenge objektet støtter et grensesnitt som innringer vet om.
- Du bør si det klart i svaret at eksemplet ditt ikke er et typisk fabrikkmetodemønster, men en eller annen spesialisering som heter parameterisert fabrikkmetode. Og skriv om definisjon av typisk fabrikkmetode, fordi den er misvisende akkurat nå. Jeg lærte bare om fabrikkmetodemønster, jeg forsto alt, og så leste jeg det svaret som viser fabrikkmetodemønster som noe annet og jeg var forvirret. Det er ingen informasjon om at eksemplet ikke er et typisk fabrikkmetodemønster. Takk til SerG for at du poengterte det i kommentaren.
new
ikke er ' ta-metoden (i noen – riktignok vanlige – objektsystemer).