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

  • stackoverflow.com/questions/1001767/…
  • Aby wyjaśnić, czy masz na myśli " Metoda fabryczna " kiedy powiesz " Wzorzec fabryczny "? Jeśli mówisz o wzorcach Gang of Four, nie ma wzorca fabrycznego, ale istnieje czynnik abstrakcyjny yi metoda fabryczna.
  • Tak – metoda fabryczna.
  • Aby być uczciwym, te dwa wyrażenia wydają się dość często zamienione.
  • Ach, metoda fabryczna. Obejście problemu dla faktu, że new nie jest ' metodą ta (w niektórych – co prawda powszechnych – systemach obiektowych).

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *