Luomissuunnittelun kuvioiden esittely

Luomismallit abstrakti instantiaatioprosessi, jolloin järjestelmä riippumaton siitä, miten sen objektit luodaan, koostuu, ja edustaa. Yksi GoF kuviot, Singleton ja Factory Menetelmä ovat kaksi yleisimmin kohdattu, mutta ne ratkaistavat perustavanlaatuisesti erilaisia ongelmia. Singleton ohjaa tapausten määrää, kun taas Factory Menetelmä delegoi vastuun valita, mikä konkreettinen luokka instantiate. Virheitä joko kaava johtaa jäykkä, vaikea-test-koodi tai turhaa monimutkaisuutta. Tämä artikkeli tutkii kunkin kaavan syvällisesti, selventää niiden asianmukaiset olosuhteet, ja tarjoaa toimintakelpoisia ohjeita insinöörien välillä.

Singleton-kuvio yksityiskohtaisesti

Singletonin malli rajoittaa luokan yhteen instanssiin ja tarjoaa maailmanlaajuisen pisteen, jossa se on. Se on yksi yksinkertaisimmista malleista, mutta myös yksi kiistanalaisimmista johtuen sen vaikutuksesta testattavuuteen ja kytkentään.

Perusominaisuudet

  • Yhden instanssitakuu:[ Yksityisrakenne estää ulkoisen instanssit. Staattinen menetelmä (usein ) palauttaa ainoan instanssin.
  • Globaali pääsy:[ Esiinnoite on saatavilla mistä tahansa sovelluksen osasta, usein julkisen staattisen muuttujan tai menetelmän kautta.
  • Laiska tai innokas alustus:[] Esine voidaan luoda luokan lastausaikaan (nieger) tai lykätä ensimmäiseen pyyntöön (laiska).

Kun Singleton on sopiva

  • Jaetut resurssit, jotka on koordinoitava:[ Asennuspäälliköt, lanka-altaat, yhteysaltaat, lokipalvelut ja laitteistokäyttöliittymän ajurit vaativat usein täsmälleen yhden ohjaimen.
  • Global state that would not be replicated:[ Cache managerit, tiedostojärjestelmän abstraktio kerrokset, tai ikkunanhallintaa gui-liittymän puitteissa.
  • Resource-intensiivinen objekti: Esineet, jotka ovat kalliita luoda ja käyttää koko järjestelmän hyöty yhdestä instanssista.

Täytäntöönpano

Syöttöturvallisuus on yleisin sudenkuoppa. Naiivi toteutus, joka tarkastaa [] ja luo sitten instanssin voi tuottaa useita tapauksia monisäikeisissä ympäristöissä. Ratkaisut sisältävät kaksinkertaisen valitun lukituksen , staattisen sisäisen luokan (Bill Pugh singleton), tai enum-pohjaisen singletonin Javassa. Pythonissa lankaturvallinen alustaminen on vakio. Valitsemalla innokas ja laiska alustaus riippuu siitä, onko singleton taattu käytettäväksi ja onko sen luominen raskas.

Kritiikki ja vitfalls

Singletoneja pidetään usein anti-patterneina, koska ne ottavat käyttöön maailmanlaajuisen tilan, mikä tekee yksikkötesteistä vaikeita ja vaikeita eristää. Ne myös piilottavat riippuvuussuhteita; luokka, joka kutsuu [ suoraan kytkettynä singletons betoniluokkaan. Nykyaikainen käytäntö suosittelee riippuvuusinjektion käyttöä singleton-mallin toimitukseen yhteisenä esimerkkinä, jolloin korvaaminen pilkuilla on mahdollista testeissä. Lisäksi singletonit hajautetussa järjestelmässä (esim. mikropalvelut) ovat merkityksettömiä, ellei niitä ole laajennettu prosessia kohti.

Tehdasmenetelmä kaavio yksityiskohtaisesti

Tehdasmenetelmä -malli määrittelee käyttöliittymän objektin luomiseen, mutta antaa alaluokkien päättää, minkä luokan instantioimaan. Se siirtää kohteen luomisen vastuun asiakkaasta tehdasmenetelmään, mikä edistää avointa/suljettua periaatetta.

Perusominaisuudet

  • Kapseloitu luomislogiikka:[] Asiakaskoodi ei tunne betoniluokkaa; se toimii abstraktin tuotetyypin kautta.
  • Laajennettavuus:[ Uusia tuotetyyppejä voidaan lisätä luomalla uusia betonitehtaita muuttamatta nykyistä asiakaskoodia.
  • Vähennetty instanssi:[] Tarkka luokka instantiaatille määritetään ajoaikana, perustuen syöttöön, konfiguraatioon tai kontekstiin.

Kun tehdasmenetelmä on tarkoituksenmukainen

  • Siirtyvien esineiden perheet:[] Kun järjestelmän on toimittava useiden sellaisten tuotevariaatioiden kanssa, joilla on yhteinen käyttöliittymä, esim. eri tietokantaajurit, asiakirjavientimuodot tai käyttöliittymäteemat.
  • Poikkea asiakaskoodi konkreettisista toteutuksista:[] Asiakas kutsuu tehdasmenetelmän ja vastaanottaa abstraktin käyttöliittymän mukaisen kohteen. Konkreettiseen luokkaan tehtävät muutokset eivät vaikuta asiakkaaseen.
  • Konfiguraatio-ohjautuva luomus:[ Sovellus voi päättää käynnistettäessä, mitä betonitehdasta käytetään konfigurointitiedoston, ympäristömuuttujan tai ajoajan perusteella.

Täytäntöönpano

Tyypillinen Factory Method käyttää abstraktia luokkaa, joka ilmoittaa tehdasmenetelmän (usein abstrakti). Betoniluojat ohittavat tämän menetelmän instantiate tiettyjen tuotteiden. Kielellä ilman perintöä (esim. JavaScript) tehdas voi olla toiminto tai sulkeminen. Kuvio toimii hyvin riippuvuusinjektioastioiden kanssa, jotka voivat korvata implementaatioita. Yhteinen variantti on [ staattinen tehdasmenetelmä[ (esim. Javassa), mutta tämä ei ole sama kuin GoF Factory Method -malli.

Real-World Esimerkki: Dokumentti muunnin

Harkitse sovellusta, joka muuntaa dokumentit formaattien välillä. Abstrakti käyttöliittymä määrittelee [-menetelmän. Tehdasmenetelmä palauttaa ], [] tai []] tulolaajennuksen perusteella. Uuden muodon (esim. Markdown) lisääminen vaatii vain uuden muunninluokan ja tehdasmenetelmän päivittämisen.

Suora vertailu: Singleton vs. Factory Method

Vaikka molemmat ovat luomismalleja, niiden tavoitteet ja kompromissit ovat lähes ortogonaalisia.

Aspect Singleton Factory Method
Primary goal Ensure a single instance Encapsulate object creation
Instance count Exactly one Many instances, but created through a factory
Control over class selection Not relevant (always same class) Subclasses or runtime logic choose the concrete class
Impact on maintainability Can increase coupling (global access) Reduces coupling (client depends on abstraction)
Testability Often problematic (global state) Good, as factories can be mocked
Extensibility Limited (hard to subclass a singleton) High (new products via new factories)

Valitse Singleton, kun ensisijainen huolenaiheesi on esimerkiksi ainutlaatuisuus ja maailmanlaajuinen koordinointi. Esimerkiksi kirjautumispalvelu, jonka täytyy serialisoida kirjoittaa yhteen tiedostoon. Valitse Factory Method, kun keskityt irrottamaan kohteen luomisen asiakaskoodista ja mahdollistamaan järjestelmän kasvun uusilla tuotevalinnoilla.

Kun ne Okslap (ja milloin käyttää kumpaakaan)

On tavallista nähdä yksikerroksinen tehdas (esim. singleton ), joka osaa luoda erilaisia esineitä. Tämä lähestymistapa yhdistää molemmat kuviot, mutta perii globaalin tilan haitat. Parempi vaihtoehto on ruiskuttaa tehdasriippuvuus ja pitää tehdas itse tavallisena ryhmänä.Singleton on usein väärä valinta tehtaalle. Jos tavoitteena on jakaa tehtaan esinäyttely sovelluksen kautta, riippuvuusinjektiosäiliö voi hallita tätä esimerkkiä . Parempi vaihtoehto on ruiskuttaa tehdasriippuvuus ja pitää tehdas itse tavallisena luokana.

Käytännön pohdintoja nykyaikaisista sovelluksista

Testaus ja riippuvuus injektiosta

Molemmat mallit vuorovaikutuksessa testauksen eri tavoin. Singletons ovat tunnetusti vaikea korvata yksikkötesteissä. Yhteinen työ ympäri on ottaa käyttöön käyttöliittymä singleton ja tarjota testi kaksinkertainen, mutta se heikentää kuvioon. Tehdas Menetelmät, toisaalta, on helppo korvata tarjoamalla pilkata tehdas testeissä. Nykyajan puitteet (kevät, Unity, Guice), kontti käsittelee singleton scopping automaattisesti, poistamalla tarpeen toteuttaa kaava manuaalisesti.

Valuutanvaihto- ja jakelujärjestelmät

Singleton hajoaa hajautettuihin järjestelmiin, koska yhden instanssin . Yksinkertainen instanssi ei voi kattaa useita prosesseja tai solmuja. Jaettujen resurssien osalta mikropalveluissa insinöörit käyttävät jaettuja tietokantoja, kuten Redis, tai johtajavaalit.Tehtaiden menetelmä ei ole Singleton-malli. Tehtaan menetelmä on edelleen sovellettavissa myös hajautettuihin kontekstiin; se yksinkertaisesti luo esineitä kunkin palvelurajan sisällä.

Yhdistävät kuvioita reaalimaailman ratkaisuihin

Monet tuotantojärjestelmät yhdistävät nämä mallit älykkäästi. Esimerkiksi [Singleton-liitäntäpooli[ saattaa käyttää Factory-menetelmää luodakseen erilaisia yhteyksiä (esim. luku-vain vs. luku-kirjoitus). Singleton-malli varmistaa yhden sammion sovellusta kohti, kun taas tehdasmenetelmä käsittelee yhteyskohteiden luomista. Toinen esimerkki: singleton -dokumenttigeneraattori[, joka delegoi tehdasmenetelmän muotokohtaisten renderointien luomiseen.

Yleiset virheet välttää

  • Singletonin käyttö, kun tehdas riittää:[ Jos haluat vain yhden luokan kerta-asenteen suorituskyvystä, on yhden trooppisen riippuvuuden ruiskutus puhtaampaa kuin maailmanlaajuinen lisälaite.
  • Käytetään Factory Method kun objektin luominen on mitätön ja kiinteä:[ Jos objektityyppi ei koskaan muutu eikä ole alaluokkia, yksinkertainen rakentaja on selkeämpi.
  • Tehdas- ja tuoteperheiden välinen tiivis kytkentä:[] Vältä asennusta tai liiketoiminnan logiikkaa tehdasmenetelmän sisällä, jonka pitäisi kuulua muualle.
  • Johdinten turvallisuuden unohtaminen yksikerroksisissa laitteissa:[] Palvelinympäristöissä ei-kierukkaturvallinen singleton voi tuottaa vaurioituneen tilan kuormitettuna.

Päätelmät

Singleton ja Factory Method palvelee ohjelmistosuunnittelussa pohjimmiltaan erilaisia rooleja. Singleton toteuttaa yhden esimerkin globaalille koordinoinnille; Factory Method abstraktit objektiluonti tukemaan runtime variation ja laaja-alaisuus. Niiden välillä on arvioitava, onko ensisijainen huolenaiheesi esimerkkiyksilöllisyys tai luomisjoustavuus. Kumpikaan malli ei ole hopealuoti. Kumpikaan malli tuo kompromissit testikelpoisuudessa, kytkentä, ja monimutkaisuus. Ymmärtämällä niiden vahvuuksia ja rajoituksia insinöörit voivat soveltaa niitä tarkoituksellisesti, usein yhdessä riippuvuus injektio ja modernit puitteet, rakentaa skaalattavissa ja ylläpidettävissä järjestelmiä.

Lisätietoja saa Refactoring.Guru[ ja Factory Method[]. Myös harkita Martin Fowler"s analyysi [ Registration[]] vaihtoehtona Singleton, ja Wikipedia artikkeli Factory Method malli] kielikohtaisten täytäntöönpanojen.