După ce, în sfârșit, am încercat serios să încerc să învăț câteva tipare de bază (foarte târziu în carieră, dar asta este „o poveste diferită), încerc să obțin căutați diferențele dintre modelul Factory și Abstract Factory.
Care sunt diferențele cheie dintre aceste două modele?
Înțeleg că metoda Factory creează obiecte prin moștenire, iar Abstract Factory face prin compoziția obiectelor, dar din punct de vedere practic, încă „am probleme cu vizualizarea exactă a modului în care funcționează fiecare.
Comentarii
- stackoverflow.com/questions/1001767/…
- Pentru a clarifica, vrei să spui " Metodă din fabrică " când spui " Model din fabrică "? Dacă vorbiți despre Gangul celor patru tipare, nu există niciun model de fabrică, dar există un factor abstract y și Factory Method.
- Da – Factory Method.
- Pentru a fi corecte, cele două fraze par a fi destul de frecvent schimbate.
- Ah, Factory Method. O soluție pentru faptul că
new
nu este metoda ' ta (în unele sisteme de obiecte, desigur comune).
Răspuns
Metoda de fabrică este de obicei clasificat printr-o declarație de comutare în care fiecare caz returnează o clasă diferită, utilizând aceeași interfață rădăcină, astfel încât codul apelant să nu aibă niciodată nevoie să ia decizii cu privire la implementare.
care returnează un validator diferit pentru fiecare tip de carte.
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"); } }
Abstract Factory este locul în care aveți mai multe clase concrete din fabrică (nu metode din fabrică) derivate dintr-o singură interfață, care poate returna mai multe tipuri diferite din metode diferite.
Gândiți-vă la un manager de joc de șah cu o clasă diferită pentru fiecare set de reguli variante.
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(); } }
An Abstract Factory , la fel ca o strategie, este adesea selectat folosind o metodă din fabrică, dar nu este necesar să le combinați, deci este propriul model.
Comentarii
- Este corectă această explicație a metodei Factory? Ce ' este despre " Modelul metodei din fabrică se bazează pe moștenire, deoarece crearea obiectelor este delegată subclaselor care implementați metoda din fabrică pentru a crea obiecte ". Deci, exemplul seamănă mai mult cu Static Factory.
- @SerG Ei bine, corect, ' ați luat citatul de pe Wikipedia, pe o pagină care citea foarte bine diferit acum trei ani. Aș argumenta că pagina Wikipedia actuală se contrazice în mai multe locuri, dar nu ' am dorința de a mă implica în a distinge acest lucru. Ceea ce aș admite, în retrospectivă, este că exemplul pe care l-am furnizat aici este un tip specific de metodă fabrică, cunoscută sub numele de metoda fabrică parametrizată. Dar ideea despre diferența dintre Factory Factory și Abstract Factory este valabilă pentru toate tipurile de Method Factory.
- Aceeași afirmație ca citatul există în GoF " Modele de proiectare ". Și FM parametrizat este, de asemenea, descris acolo.
- Partea importantă este că fabrica va oferi apelantului un obiect adecvat, în funcție de situația particulară, iar apelantul nu ' nu trebuie să știe care este exact clasa acelui obiect și nu ' nu trebuie să știe cum a fost ales obiectul respectiv, atâta timp cât obiectul acceptă o interfață pe care apelantul știe.
- Ar trebui să declarați clar în răspunsul dvs. că exemplul dvs. nu este un model tipic de metodă din fabrică, ci o specializare numită metodă din fabrică parametrizată. Și scrieți despre definiția metodei tipice din fabrică, pentru că este greșită acum. Tocmai învățam despre modelul metodei din fabrică, am înțeles totul și apoi am citit răspunsul care arată modelul metodei din fabrică ca fiind ceva diferit și am fost confuz. Nu există informații despre faptul că acest exemplu nu este un model tipic de metodă din fabrică. Mulțumim SerG pentru că a indicat acest lucru în comentariu.