Kun olen vihdoin alkanut vakavasti yrittää oppia joitain perusmalleja (hyvin myöhään uralla, mutta se on erilainen tarina), yritän saada selvitä tehdasmallin ja abstraktitehtaan väliset erot.
Mitkä ovat tärkeimmät erot näiden kahden mallin välillä?
Ymmärrän, että tehdasmenetelmä luo objekteja perimisen kautta ja abstrakti tehdas tekee se esineiden sommittelun kautta, mutta käytännön näkökulmasta minulla on edelleen vaikeuksia visualisoida tarkalleen, miten ne kukin toimivat.
Kommentit
Vastaus
Tehdasmenetelmä luokitellaan yleensä kytkinlausekkeella, jossa jokainen tapaus palauttaa eri luokan käyttämällä samaa juuriliitäntää, jotta kutsukoodin ei koskaan tarvitsisi tehdä päätöksiä toteutuksesta.
Ajattele luottokortin validointitehdasta joka palauttaa eri vahvistajan kullekin korttityypille.
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"); } }
Tiivistetehdas on, jos sinulla on useita konkreettisia tehdasluokkia (ei tehdasmenetelmiä), jotka on johdettu yhdestä käyttöliittymästä ja jotka saattavat palauttaa monia erilaisia tyyppejä eri menetelmistä.
Ajattele shakkipelien hallintaa, jolla on eri luokka jokaiselle muunnossääntöjoukolle.
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(); } }
Abstrakti tehdas , aivan kuten strategia, usein valitaan tehdasmenetelmällä, mutta niitä ei tarvitse yhdistää, joten se on oma malli.
Kommentit
- Onko tuo tehdasmenetelmän selitys oikea? Mitä ' s koskee " Tehdasmenetelmän malli perustuu perintöön, koska objektin luonti delegoidaan alakategorioihin , jotka toteuta tehdasmenetelmä objektien luomiseksi ". Joten esimerkki on enemmän kuin Staattinen tehdas.
- @SerG No, oikeudenmukaisesti, olet ' noutanut kyseisen lainauksen Wikipedian sivulta, joka luki hyvin toisin kolme vuotta sitten. Väitän, että nykyinen Wikipedia-sivu on ristiriidassa monien paikkojen kanssa, mutta minulla ei ole ' halua osallistua tämän valitsemiseen. Myönnän jälkikäteen, että tässä annettu esimerkki ' ve on tietyntyyppinen tehdasmenetelmä, joka tunnetaan nimellä parametrisoitu tehdasmenetelmä. Mutta tehdasmenetelmän ja abstraktin tehtaan välinen ero on kaikentyyppisissä tehdasmenetelmissä.
- Sama lause kuin lainauksessani on olemassa GoF " -suunnittelukuvioissa ". Parametrisoitua FM: ää kuvataan myös siellä.
- Tärkeää on, että tehdas antaa soittajalle sopivan objektin tilanteesta riippuen, ja soittaja ei ' t: n on tiedettävä mikä objektin luokka tarkalleen on, ja sen ei tarvitse tietää ' t, kuinka tietty objekti valittiin, kunhan objekti tukee rajapintaa, jonka soittaja tietää.
- Sinun on ilmoitettava vastauksessasi selvästi, että esimerkkisi ei ole tyypillinen tehdasmenetelmämalli, vaan jokin erikoistuminen nimeltä parametrisoitu tehdasmenetelmä. Ja kirjoita tyypillisen tehtaan menetelmän määrittelystä, koska se on väärässä paikassa juuri nyt. Olin juuri oppimassa tehdasmenetelmäkuviosta, ymmärsin kaiken ja sitten luin vastauksen, joka osoittaa tehdasmenetelmän mallin erilaiseksi ja olin hämmentynyt. Ei ole tietoa siitä, että esimerkki ei ole tyypillinen tehdasmenetelmämalli. Kiitos SerG: lle tämän kommentoimisesta.
new
ei ole ' ta -menetelmää (joissakin – tosin tavallisissa – oliojärjestelmissä).