Poté, co jsem se konečně začal vážně snažit naučit se některé základní vzorce (velmi pozdě v kariéře, ale to je jiný příběh), snažím se dostat své zaměřte se na rozdíly mezi Factory Pattern a Abstract Factory.

Jaké jsou klíčové rozdíly mezi těmito dvěma vzory?

Chápu, že Factory Factory vytváří objekty prostřednictvím dědičnosti a Abstract Factory ano prostřednictvím kompozice objektů, ale z praktického hlediska mám stále potíže s přesnou vizualizací toho, jak fungují.

Komentáře

  • stackoverflow.com/questions/1001767/…
  • Pro objasnění máte na mysli " Tovární metoda " když řeknete " tovární vzor "? Pokud mluvíte o vzorech Gang čtyř, neexistuje tovární vzor, ale existují abstraktní faktory y a tovární metoda.
  • Ano – tovární metoda.
  • Abychom byli spravedliví, zdá se, že obě fráze jsou docela běžně zaměňovány.
  • Ah, tovární metoda. Řešení skutečnosti, že new není ' ta metoda (v některých – nepochybně běžných – objektových systémech).

Odpověď

Tovární metoda je obvykle kategorizován příkazem switch, kde každý případ vrací jinou třídu pomocí stejného kořenového rozhraní, takže volací kód nikdy nemusí rozhodovat o implementaci.

Představte si továrnu na ověřování kreditních karet který vrací odlišný validátor pro každý typ karty.

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"); } } 

Abstraktní továrna je místo, kde máte více konkrétních tříd továrny (nikoli Factory Methods) odvozených z jednoho rozhraní, které může vracet mnoho různých typů z různých metod.

Představte si šachového manažera s jinou třídou pro každou sadu pravidel variant.

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(); } } 

Abstraktní továrna , podobně jako strategie, je často vybráno pomocí tovární metody, ale není nutné je kombinovat, takže jde o jeho vlastní vzor.

Komentáře

  • Je toto vysvětlení Factory metody správné? Co ' s " Vzor tovární metody závisí na dědičnosti, protože vytváření objektů je delegováno na podtřídy , které implementujte tovární metodu pro vytváření objektů ". Příklad se tedy podobá spíše statické továrně.
  • @SerG No, poctivě, ' jste si vybrali citát z Wikipedie, na stránce, která se čte velmi před třemi lety jinak. Tvrdil bych, že současná stránka Wikipedie si na několika místech odporuje, ale nemám touhu zapojit se do toho, abych to rozdělil. Při zpětném pohledu bych připustil, že příklad, který jsem zde uvedl, je specifický druh tovární metody, známý jako parametrizovaná tovární metoda. Ale bod o rozdílu mezi Factory Method a Abstract Factory platí u všech typů Factory Method.
  • Stejné tvrzení jako můj citát existuje v GoF " návrhových vzorech ". A je zde také popsáno Parametrizované FM.
  • Důležitou součástí je, že továrna poskytne volajícímu vhodný objekt v závislosti na konkrétní situaci a volající nedělá ' t need to know what exactly the class of that object it, and doesn ' t need to know how the specific object was selected, as the object supports an interface that the volající o tom ví.
  • Ve své odpovědi byste měli uvést, že váš příklad není typickým vzorem tovární metody, ale nějakou specializací nazvanou parametrizovaná tovární metoda. A pište o definici typické tovární metody, protože právě teď je nesprávně vyladěná. Právě jsem se učil o vzorci tovární metody, všechno jsem pochopil a pak jsem si přečetl tu odpověď, která ukazuje vzor tovární metody jako něco jiného, a byl jsem zmatený. Neexistují žádné informace o tom, že tento příklad není typickým vzorem tovární metody. Děkuji SerGu za to, že jsem to komentoval.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *