Kolmen keskeisen luomismallin ymmärtäminen

Ohjelmistosuunnittelumallit ovat taistelutestattuja piirustuksia toistuvien suunnitteluongelmien ratkaisemiseksi. Yleisimpiä käytetään luomismallien ...Singleton, Factory ja Prototype. Jokainen ohjaa kohteiden instansiointia. Oikean toiminnon valinta vaikuttaa suoraan koodin ylläpidettävyyteen, suorituskykyyn ja skaalautuvuuteen. Tämä laajennettu opas sukeltaa syvälle jokaiseen malliin, tutkii tosimaailman skenaarioita ja tarjoaa toimintakelpoisia kriteerejä, joiden avulla voit tehdä perustellun päätöksen.

Singleton kuvio: Yksi instanssi hallitsee kaikki

Singletonin malli takaa, että luokassa on täsmälleen yksi instanssi ja että se tarjoaa globaalin yhteyspisteen. Se on yksi yksinkertaisimmista malleista, mutta sitä käytetään usein väärin. Keskeinen idea on hallita instanssiprosessia niin, että riippumatta siitä, kuinka monta kertaa luokkaa pyydetään, sama kohde palautetaan.

Miten Singleton toimii

Tyypillisesti Singleton-luokassa on yksityinen rakentaja ja staattinen menetelmä, joka palauttaa instanssin. Ensimmäinen kutsu luo kohteen; myöhemmin puhelut käyttävät samaa instanssia uudelleen. Monisäikeisissä ympäristöissä tarvitaan synkronointia, jotta estetään rotuolosuhteet, jotka voivat luoda useita tapauksia.

public class DatabaseConnectionPool {
 private static DatabaseConnectionPool instance;
 private DatabaseConnectionPool() { /* initialization */ }
 public static synchronized DatabaseConnectionPool getInstance() {
 if (instance == null) {
 instance = new DatabaseConnectionPool();
 }
 return instance;
 }
}

Kun Singleton loistaa

  • Jaettujen resurssien hallinta:[ Yhteyspooli, lokipalvelu tai konfiguraatiopäällikkö hyötyvät yhdestä koordinointipisteestä.
  • Globaali tila:[ Kun sovelluksen kokoinen välimuisti tai rekisteri tarvitsee johdonmukaisen pääsyn.
  • Kieto- tai käyttöjärjestelmätason resurssit:[ Tiedostojärjestelmät, tulostinsymbolit tai ikkunanhallintalaitteet sallivat yleensä vain yhden esimerkin.

Yleiset pitfalls välttää

  • Ylikäyttö:[ Singletonin käyttö kaikkeen johtaa piilotettuihin riippuvuuksiin ja tekee yksikön testauksesta vaikeaa, koska et voi helposti korvata tapausta pilkalla.
  • Klassinen synkronoitu menetelmä voi muuttua pullonkaulaksi. Vaihtoehtoja, kuten innokas alustus tai kaksin verroin tarkastettu lukitus (volatiililla) vähentävät kiistaa.
  • Tiivis kytkentä:[] Koska maailmanlaajuinen yhteyspiste on kova koodattu, asiakkaat liitetään betonin Singleton luokkaan rikkoen riippuvuus-inversioperiaatetta.

Näistä haittapuolista huolimatta Singleton on edelleen hyödyllinen, kun todella tarvitset yhden, maailmanlaajuisesti esteettömän kohteen. Syvempää ymmärrystä varten, katso [Refactoring Guru... Singleton opas.

Tehtaan kuvio: Delegoiva objektiluonti

Tehdasmalli tiivistää kohteen instantiaatiologiikan, jolloin alaluokat voivat päättää, minkä luokan instantioimaan. Se tulee kahdessa päämakussa: [Factory Method[] (yksi menetelmä, joka palauttaa uusia esineitä) ja [Abstract Factory[ (suku, johon liittyy tehdasmenetelmiä). Molemmat poistavat asiakaskoodin betoniluokista, edistävät löysää kytkentää ja helpompaa laajenemista.

Tehdasmenetelmä yksityiskohtaisesti

Määrittele käyttöliittymä objektin luomiselle, mutta anna alaluokkien muuttaa luotavien objektien tyyppiä. Esimerkiksi valintaikkunaluokassa saattaa olla menetelmä . Aliluokat kuten WindowsDialog ja LinuxDialog ohittavat tämän menetelmän palauttaakseen alustakohtaiset painikkeet.

abstract class Dialog {
 abstract Button createButton();
 public void render() {
 Button okButton = createButton();
 okButton.onClick();
 }
}
class WindowsDialog extends Dialog {
 Button createButton() { return new WindowsButton(); }
}

Tämä kuvio on ihanteellinen, kun:

  • Luokka ei voi ennakoida luomiensa esineiden luokkaa.
  • Haluat lokalisoida objektin luomislogiikan yhteen paikkaan.
  • Järjestelmän on oltava riippumaton siitä, miten sen esineet on rakennettu.

Abstrakti tehdas: Perheiden tuottaminen lähikohteista

Abstract Factory tarjoaa käyttöliittymän luoda perheitä liittyvät tai riippuvaisia esineitä määrittelemättä niiden betoniluokat. Ajattele GUI työkalupakki, joka on tuotettava painikkeet, valintalaatikot, ja vierityspalkit, jotka näyttävät johdonmukaiselta tietyn teeman (esim., Materiaali, Cupertino). Asiakas käyttää abstraktin tehtaan käyttöliittymän saada tuotteita, ja betoni tehtaat (MaterialFactory, CupertinoFactory) tuottaa oikeat vaihtoehdot.

Tämä malli on suositeltavampi, kun

  • Järjestelmä on konfiguroitava yhteen useista tuoteperheistä.
  • Haluat valvoa johdonmukaisuutta tuotteiden välillä.
  • Uusien tuoteperheiden lisääminen edellyttää pieniä muutoksia olemassa olevaan koodiin.

Tehtaan ja muiden kuvioiden välinen päätös

Tehdas on sinun go-to kun objektin luominen on monimutkainen tai kun sinun täytyy vaihtaa toteutuksia runtime. Se on joustavampi kuin Singleton, koska se ei rajoita tapausten määrää. Toisin kuin Prototype, Tehdas luo uusia tapauksia tyhjästä eikä kopioi olemassa olevia. Kattava yleiskatsaus molemmista versioista, käy []Refactoring Guru...

Prototyyppi Kuvio: Klooni Muodostamisen sijaan

Prototyyppi luo uusia esineitä kopioimalla olemassa olevan kohteen. Se on erityisen arvokasta, kun instantiaatio on kallista (esim. raskaat tietokantakyselyt, monimutkaiset geometrialaskelmat) tai kun objektin konfiguraatio vie aikaa. Sen sijaan, että se rakentaisi tyhjästä, kloonaat esimuotoilun ja muokkaat sitä tarpeen mukaan.

Kloonaus Mekaniikka: Matala vs. syvä kopio

Useimmat ohjelmointikielet tarjoavat sisäänrakennetun kloonimenetelmän ([] Javassa, [ Pythonissa, [] tai JavaScriptissä. Kuitenkin on huolellisesti kiinnitettävä huomiota siihen, onko kopio matala (jaetut viittaukset mutalisoitaviin esineisiin) vai syvä (täysin riippumaton). Syvä kopio toistaa rekursiivisesti kaikki kloonin mainitsemat esineet. Prototyypin toteutuksessa on kuitenkin päätettävä, mikä kopiointitaso sopii käyttötapaukseesi.

class MazePrototype {
 public MazePrototype clone() throws CloneNotSupportedException {
 return (MazePrototype) super.clone(); // shallow copy
 }
}

Ideal skenaariot prototyypeille

  • Esimerkiksi suuren kokoonpanon lataaminen tiedostosta tai monimutkaisen geometrisen verkon luominen.
  • Dynaamisen ajoajan kohteet:[] Kun järjestelmän on tuotettava uusia esineitä, joiden tyypit määritetään ajon aikana (esim., vihollistyypit pelissä, joka on syntynyt ennalta määritellyt mallit).
  • Alaluokan räjähdyksiä: [ Sen sijaan, että luot monia alaluokkia pieniin vaihteluihin, kloonaat prototyypin ja säädät muutamia ominaisuuksia.

Prototyyppirekisteri ja välimuisti

Voit ottaa Prototype askel pidemmälle ottamalla käyttöön rekisterin.Kyseinen tallentaa valmiiksi rakennettu prototyyppejä indeksoitu avain. Asiakkaat pyytävät prototyypin avain, kloonaa se, ja muokata sitä. Tämä yhdistelmä Prototype rekisterin kanssa voi toimia kevyt vaihtoehto joko Factory tai Singleton tietyissä tapauksissa. Yksityiskohtainen läpikäyminen, katso Refactoring Guru.

Sivu-sivu vertailu: Singleton, Factory, Prototyyppi

Alla olevassa taulukossa esitetään tärkeimmät erot:

PatternInstance CountCreation MechanismBest For
SingletonExactly oneSelf-managed global accessShared resources, global state
FactoryMultiple instances (or families)Centralized creation logicDecoupling client from concrete classes, complex creation
PrototypeMultiple instances cloned from a templateCloning (shallow/deep copy)Expensive instantiation, runtime object generation

Kun kuviot Oksapin tai Yhdistä

  • Singleton + Factory:[ Tehdas voi itsessään olla Singleton (esim. yksi abstrakti tehdas alustaa kohti). Tämä yhdistää globaalin pääsyn keskitettyyn luomiseen.
  • Prototyyppi + Tehdas:[ Prototyyppirekisteri voi toimia tehtaana.Kloonaa prototyyppi sen sijaan, että kutsuisit rakentajaa. Tämä on erityisen hyödyllistä pelin kehittämisessä kutuyhteisöjen ollessa kyseessä.
  • Prototyyppi + Singleton:[ Prototyyppi esine saattaa olla Singleton siinä mielessä, että vain yksi prototyyppiesiintyminen on olemassa tyyppiä kohden, vaikka kloonit eivät ole singletoneja.

Käytännön päätöksentekokehys

Kun kohtaat suunnitteluongelman, joka vaatii luomiskuvion, kysy nämä kysymykset järjestyksessä:

  1. Tarvitsenko koko hakemuksen ajan täsmälleen yhden esimerkin?[ Jos kyllä, niin ota huomioon Singleton. Mutta varmista, että maailmanlaajuisesti jaettua valtiota todella tarvitaan ja että koettavuus ei kärsi.
  2. Onko objektin luominen monimutkainen tai todennäköisesti muuttuu?[] Jos kyllä, käytä Factory Method tai Abstract Factory. Tämä on erityisen hyödyllistä, kun odotat uusien objektityyppien lisäämistä myöhemmin.
  3. On objektin luominen suorituskykyä pullonkaula, vai tarvitsenko monia tapauksia, jotka eroavat vain hieman?[] Jos kyllä, Prototyyppi voi säästää aikaa ja muistia kloonaamalla mallin.
  4. Voiko useampi kuin yksi kuvio palvella samaa tarkoitusta?[] Arvioida kompromissit. Esimerkiksi Flyweight-malli voisi vähentää muistia Prototyypin sijaan, jos tavoitteena on jakaa muuttumattomia tietoja.

Real-World Esimerkkejä Engineering Software

Tekniikan sovellukset usein sekoita nämä mallit. CAD-järjestelmä voisi käyttää Singleton käyttäjäasetukset manager, Factory luoda erilaisia geometrisiä muotoja (ympyrä, monikulmio, spline), ja Prototyyppi kloonaamiseksi monimutkainen kokoonpano ja sitten muuttaa sitä. Simulaatio moottori voisi käyttää Factory luoda erilaisia ratkaisija esineitä, Prototype kopioida hiukkasjärjestelmien kokoonpanoja, ja Singleton varten hakkuupalvelu, joka tallentaa kaikki simulointivaiheet.

Johtopäätös: Don... anna kuvioiden Idefoida sinun muotoiluasi

Singleton, Factory ja Prototype ovat luomismalleja, mutta ne eivät ole hopealuoteja. Paras valinta syntyy järjestelmän ymmärtämisestä. Rajoitukset: esimerkiksi tarve hallita, objektin luomisen monimutkaisuus ja uusien tapausten kustannukset. Aina parempi selkeys ja testauskelpoisuus kuin mallin puhtaus. Jos epäilykset, aloita Factory. Se tarjoaa puhtaimman irrottamisen ja voidaan myöhemmin korvata tai täydentää Prototype tai Singleton jos tilanne vaatii.

Ohjaamalla nämä kolme mallia, varustat itsellesi monipuolisen työkalupaketin, jonka avulla rakennamme luotettavia, joustavia suunnitteluohjelmistoja. Jatkolukua varten tutustu []Wikipedia-artikkeliin ohjelmistosuunnittelumalleista[] ja []Refactoring Guru-katsaukseen luomismallista.