W końcu zacząłem na poważnie uczyć się kilku podstawowych wzorców (bardzo późno w karierze, ale to już inna historia). omiń różnice między wzorcem fabrycznym a fabryką abstrakcyjną.
Jakie są kluczowe różnice między tymi dwoma wzorcami?
Rozumiem, że metoda fabryki tworzy obiekty poprzez dziedziczenie, a fabryka abstrakcyjna poprzez kompozycję obiektów, ale z praktycznego punktu widzenia nadal mam problem z wyobrazeniem sobie dokładnie, jak one działają.
Komentarze
Odpowiedź
Metoda fabryczna jest zwykle klasyfikowany za pomocą instrukcji switch, w której każdy przypadek zwraca inną klasę, używając tego samego interfejsu głównego, dzięki czemu kod wywołujący nigdy nie musi podejmować decyzji dotyczących implementacji.
Pomyśl o fabryce walidatorów kart kredytowych która zwraca inny walidator dla każdego typu 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"); } }
Abstract Factory to sytuacja, w której masz wiele konkretnych klas fabrycznych (nie metod fabrycznych) pochodzących z jednego interfejsu, który może zwracać wiele różnych typów z różnych metod.
Pomyśl o menadżerze gry w szachy z inną klasą dla każdego zestawu reguł dotyczących wariantów.
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(); } }
Fabryka abstrakcyjna podobnie jak strategia, jest często wybierana przy użyciu metody fabrycznej, ale nie jest konieczne ich łączenie, więc jest to własny wzorzec.
Komentarze
- Czy to wyjaśnienie metody Factory jest poprawne? Czego ' dotyczy " Wzorzec metody fabryki opiera się na dziedziczeniu, ponieważ tworzenie obiektów jest delegowane do podklas , które zaimplementuj fabryczną metodę tworzenia obiektów ". Tak więc przykład jest bardziej podobny do Static Factory.
- @SerG Cóż, uczciwie mówiąc, ' pobrałeś ten cytat z Wikipedii na stronie, która brzmi bardzo inaczej trzy lata temu. Twierdziłbym, że obecna strona Wikipedii w kilku miejscach jest sprzeczna ze sobą, ale nie ' nie mam ochoty angażować się w rozróżnianie tego. Z perspektywy czasu przyznałbym, że podany przeze mnie przykład ' jest specyficznym rodzajem metody fabrycznej, znanym jako metoda sparametryzowana. Ale kwestia różnicy między metodą fabryczną a fabryką abstrakcyjną dotyczy wszystkich typów metod fabrycznych.
- Istnieje to samo stwierdzenie, co mój cytat w GoF " Wzorce projektowe ". Opisano tam również sparametryzowany FM.
- Ważną częścią jest to, że fabryka dostarczy dzwoniącemu odpowiedni obiekt, w zależności od konkretnej sytuacji, a dzwoniący nie ' t trzeba wiedzieć, jaką dokładnie klasę tego obiektu to i czy ' nie trzeba wiedzieć, w jaki sposób dany obiekt został wybrany, o ile obiekt obsługuje interfejs, który osoba dzwoniąca wie o tym.
- Powinieneś jasno powiedzieć w swojej odpowiedzi, że twój przykład nie jest typowym wzorcem metody fabrycznej, ale jakąś specjalizacją o nazwie sparametryzowana metoda fabryczna. I napisz o definicji typowej metody fabrycznej, ponieważ jest ona teraz źle ładowana. Właśnie uczyłem się o wzorcu metody fabrycznej, wszystko zrozumiałem, a potem przeczytałem odpowiedź, która pokazuje, że wzorzec metody fabrycznej jest czymś innym i byłem zdezorientowany. Nie ma informacji, że ten przykład nie jest typowym wzorcem metody fabrycznej. Dzięki SerG za wskazanie tego w komentarzu.
new
nie jest ' metodą ta (w niektórych – co prawda powszechnych – systemach obiektowych).