Singleton Pattern on luultavasti laajimmin käytetty suunnittelukuvio. Se on yksinkertainen kuvio, helppo ymmärtää ja käyttää. Joskus sitä käytetään liikaa ja tilanteissa, joissa sitä ei vaadita. Tällaisissa tapauksissa sen käytön haitat ovat suuremmat kuin sen tuomat edut. Tästä syystä singleton-kuviota pidetään joskus antipattern tai kuvion singleton .
Tärkeitä aiheita Singleton Method -suunnittelumallille
- Mikä on Singleton Method Design Pattern?
- Milloin käyttää Singleton Method -suunnittelumallia?
- Singletonin alustustyypit
- Singleton Method -suunnittelumallin avainkomponentti:
- Singleton Method Design Patternin toteutus
- Eri tapoja toteuttaa Singleton Method Design Pattern
- Käytä mallin Singleton-menetelmää
- Singleton Method Design Patternin edut:
- Singleton Design Patternin haitat
1. Mikä on Singleton Method Design Pattern?
Singleton-menetelmä tai Singleton Design -kuvio on yksi yksinkertaisimmista suunnittelukuvioista. Se varmistaa, että luokalla on vain yksi ilmentymä, ja tarjoaa maailmanlaajuisen pääsypisteen siihen.

2. Milloin käyttää Singleton Method Design Pattern -mallia?
Käytä Singleton-menetelmän suunnittelumallia, kun:
rekisterin siirtologiikka
- Luokassa on oltava täsmälleen yksi esiintymä ja se on oltava asiakkaiden käytettävissä tunnetusta tukiasemasta.
- Milloin ainoan ilmentymän pitäisi olla laajennettavissa alaluokituksella ja asiakkaiden tulisi voida käyttää laajennettua ilmentymää muuttamatta
- Singleton-luokkia käytetään kirjaamiseen, ajuriobjekteihin, välimuistiin ja säievaraan, tietokantayhteyksiin.
3. Singletonin alustustyypit
Singleton-luokka voidaan instantoida kahdella menetelmällä:
osoitin kohdassa c
- Varhainen alustus: Tässä menetelmässä luokka alustetaan riippumatta siitä, käytetäänkö sitä vai ei. Tämän menetelmän tärkein etu on sen yksinkertaisuus. Aloitat kurssin luokan latauksen yhteydessä. Sen haittapuoli on, että luokka alustetaan aina riippumatta siitä, käytetäänkö sitä vai ei.
- Laiska alustus: Tässä menetelmässä luokka alustetaan vain, kun sitä vaaditaan. Se voi säästää sinua luomasta luokkaa, kun et tarvitse sitä. Yleensä laiska alustus on käytössä, kun luomme singleton-luokan.
4. Singleton Method -suunnittelumallin avainkomponentti:
4.1. Staattinen jäsen:
Singleton-kuvio tai kuvio Singleton käyttää staattista jäsentä luokassa. Tämä staattinen jäsen varmistaa, että muistia varataan vain kerran, mikä säilyttää Singleton-luokan yksittäisen esiintymän.
Java
// Static member to hold the single instance private static Singleton instance;>
4.2. Yksityinen rakentaja:
Singleton-kuvio tai kuviosingleton sisältää yksityisen rakentajan, joka toimii esteenä ulkoisia yrityksiä vastaan luoda Singleton-luokan esiintymiä. Tämä varmistaa, että luokalla on hallinnan toteutusprosessiaan.
Java // Private constructor to // prevent external instantiation class Singleton { // Making the constructor as Private private Singleton() { // Initialization code here } }>
4.3. Staattinen tehdasmenetelmä:
Singleton-kuvion ratkaiseva näkökohta on staattisen tehdasmenetelmän läsnäolo. Tämä menetelmä toimii yhdyskäytävänä ja tarjoaa maailmanlaajuisen yhteyspisteen Singleton-objektiin. Kun joku pyytää ilmentymää, tämä menetelmä joko luo uuden ilmentymän (jos sellaista ei ole) tai palauttaa olemassa olevan ilmentymän kutsujalle.
Java // Static factory method for global access public static Singleton getInstance() { // Check if an instance exists if (instance == null) { // If no instance exists, create one instance = new Singleton(); } // Return the existing instance return instance; }>
5. Singleton Method Design Patternin toteutus
Singleton Design Patternin tai Pattern Singletonin toteutus on kuvattu seuraavassa luokkakaaviossa:

Singleton Method Design Patternin toteutus
x tai c++
Singleton Design -mallin toteutus on hyvin yksinkertaista ja koostuu yhdestä luokasta. Yksittäisen ilmentymän yksilöllisyyden varmistamiseksi kaikista singleton-konstruktoreista tulee tehdä yksityisiä. Maailmanlaajuinen pääsy tapahtuu staattisen menetelmän avulla, jota voidaan käyttää maailmanlaajuisesti yhteen esiintymään koodin osoittamalla tavalla.
Java /*package whatever //do not write package name here */ import java.io.*; class Singleton { // static class private static Singleton instance; private Singleton() { System.out.println('Singleton is Instantiated.'); } public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } public static void doSomething() { System.out.println('Somethong is Done.'); } } class GFG { public static void main(String[] args) { Singleton.getInstance().doSomething(); } }>
Lähtö
Singleton is Instantiated. Somethong is Done.>
GetInstance-menetelmällä tarkistamme, onko ilmentymä tyhjä. Jos ilmentymä ei ole tyhjä, se tarkoittaa, että objekti on luotu aiemmin; muuten luomme sen käyttämällä uutta operaattoria.
6. Eri tapoja toteuttaa Singleton Method Design Pattern
Joskus meillä on oltava vain yksi luokkamme esiintymä, esimerkiksi yksi DB-yhteys, joka on jaettu useille objekteille, koska erillisen DB-yhteyden luominen jokaiselle objektille voi olla kallista. Samoin sovelluksessa voi olla yksi konfiguraatiohallinta tai virheenhallinta, joka käsittelee kaikki ongelmat useiden hallintaohjelmien luomisen sijaan.
Katsotaanpa erilaisia suunnitteluvaihtoehtoja tällaisen luokan toteuttamiseksi. Jos hallitset hyvin staattisia luokkamuuttujia ja käyttöoikeusmuuttujia, tämän ei pitäisi olla vaikea tehtävä.
heittää heittoja javassa
Menetelmä 1 – Perinteinen toteutus || Tee getInstance()sta staattinen toteuttamista varten Singleton Method Design Pattern
Java // Classical Java implementation of singleton // design pattern class Singleton { private static Singleton obj; // private constructor to force use of // getInstance() to create Singleton object private Singleton() {} public static Singleton getInstance() { if (obj == null) obj = new Singleton(); return obj; } }>
Täällä olemme julistaneet getInstance() staattinen, jotta voimme kutsua sitä ilman luokkaa ilmentämättä. Ensimmäinen kerta getInstance() kutsutaan se luo uuden singleton objektin ja sen jälkeen se vain palauttaa saman objektin.
Huomautus: Singleton obj:ta ei luoda ennen kuin tarvitsemme sitä ja kutsumme getInstance() menetelmä. Tätä kutsutaan laiskaksi instantiaatioksi. Yllä olevan menetelmän suurin ongelma on, että se ei ole lankaturvallinen. Harkitse seuraavaa suoritusjärjestystä.
Tämä suoritussarja luo kaksi objektia singletonille. Siksi tämä klassinen toteutus ei ole lankaturvallinen.
Menetelmä 2 || Synkronoi getInstance() toteuttamista varten Singleton Method Design Pattern
Java // Thread Synchronized Java implementation of // singleton design pattern class Singleton { private static Singleton obj; private Singleton() {} // Only one thread can execute this at a time public static synchronized Singleton getInstance() { if (obj == null) obj = new Singleton(); return obj; } }>
Tässä synkronoinnin käyttö varmistaa, että vain yksi säie kerrallaan voidaan suorittaa getInstance() . Tämän menetelmän suurin haitta on, että synkronoinnin käyttäminen joka kerta yksittäistä objektia luotaessa on kallista ja voi heikentää ohjelman suorituskykyä. Kuitenkin, jos suorituskyky getInstance() ei ole kriittinen sovelluksellesi, tämä menetelmä tarjoaa puhtaan ja yksinkertaisen ratkaisun.
Menetelmä 3 – Innokas instanssi || Staattinen alustuspohjainen singleton suunnittelumallin toteutus
Java // Static initializer based Java implementation of // singleton design pattern class Singleton { private static Singleton obj = new Singleton(); private Singleton() {} public static Singleton getInstance() { return obj; } }>
Tässä olemme luoneet yksittäisen esiintymän staattiseen alustukseen. JVM suorittaa staattisen alustuksen, kun luokka ladataan, joten tämä on taatusti säikeen turvallista. Käytä tätä menetelmää vain, kun singleton-luokkasi on kevyt ja sitä käytetään koko ohjelman suorittamisen ajan.
Menetelmä 4 – Tehokkain || Käytä kaksinkertaista lukitusta toteuttaaksesi yksittäiskuvion
Jos huomaat huolellisesti, kun objekti on luotu, synkronoinnista ei ole enää hyötyä, koska nyt obj ei ole nolla ja mikä tahansa toimintosarja johtaa johdonmukaisiin tuloksiin. Joten hankimme lukon getInstance() -kohdassa vain kerran, kun obj on nolla. Tällä tavalla synkronoimme vain ensimmäisen tien, juuri sen, mitä haluamme.
binäärihakupuuJava
// Double Checked Locking based Java implementation of // singleton design pattern class Singleton { private static volatile Singleton obj = null; private Singleton() {} public static Singleton getInstance() { if (obj == null) { // To make thread safe synchronized (Singleton.class) { // check again as multiple threads // can reach above step if (obj == null) obj = new Singleton(); } } return obj; } }>
Olemme julistaneet obj haihtuvia joka varmistaa, että useat säikeet tarjoavat obj-muuttujan oikein, kun se alustetaan Singleton-instanssiin. Tämä menetelmä vähentää merkittävästi synkronoidun menetelmän kutsumisen joka kerta kustannuksia.
7. Käytä tapausta Pattern Singleton -menetelmästä
- Tietokantayhteydet: Sovelluksissa, joissa tietokantayhteyksien luominen ja hallinta on kallista, Singletonia voidaan käyttää ylläpitämään yhtä tietokantayhteyttä koko sovelluksessa.
- Kokoonpanon hallinta: Kun sinulla on yleisiä määritysasetuksia, joihin sovelluksen eri osien on päästävä, Singleton-kokoonpanonhallinta voi tarjota yhden pääsyn näihin asetuksiin.
- GUI-komponentit: Graafisen käyttöliittymän (GUI) komponenttien tai ohjaimien osalta Singleton voi auttaa hallitsemaan käyttöliittymän tilaa ja toimintoja tarjoamalla yhden ohjauspisteen.
- Laitepäälliköt: Sulautetuissa järjestelmissä tai sovelluksissa, jotka ovat vuorovaikutuksessa laitteistolaitteiden kanssa, Singletonia voidaan käyttää hallitsemaan ja valvomaan pääsyä laitteistoihin ristiriitojen välttämiseksi.
- Tulostuspalvelu: Järjestelmissä, joissa tulostetaan asiakirjoja tai raportteja, Singleton-tulostuspalvelu voi koordinoida ja hallita tulostustöitä ja varmistaa tulostusresurssien tehokkaan käytön.
8. Singleton Method Design Patternin edut:
- Ratkaisee nimien törmäykset: Skenaarioissa, joissa tarvitaan vain yksi ohjauspiste nimeämisristiriitojen tai -törmäysten välttämiseksi, Singleton-malli varmistaa, että vain yksi esiintymä on yksilöllinen nimi.
- Innokas tai laiska alustus: Singleton-malli tukee sekä innokasta alustusta (instanssin luominen, kun luokka ladataan) että laiska alustusta (ilmentymän luominen, kun sitä ensimmäisen kerran pyydetään), mikä tarjoaa joustavuutta käyttötapauksen mukaan.
- Langan turvallisuus: Oikein toteutetut Singleton-mallit voivat tarjota säikeen turvallisuuden varmistaen, että ilmentymä luodaan atomaarisesti ja että useat säikeet eivät vahingossa luo päällekkäisiä ilmentymiä.
- Pienempi muisti: Sovelluksissa, joissa resurssien kulutus on kriittistä, Singleton-malli voi vähentää muistijalanjälkeä varmistamalla, että luokassa on vain yksi esiintymä.
9. Singleton Design Patternin haitat
- Testauksen vaikeudet: Koska Singletons esittelee globaalin tilan, yksikkötestauksesta voi tulla haastavaa. Yhden komponentin testaus erikseen voi olla monimutkaisempaa, jos se perustuu Singletoniin, koska Singletonin tila voi vaikuttaa testien tuloksiin.
- Samanaikaisuusongelmat: Monisäikeisessä ympäristössä voi olla ongelmia, jotka liittyvät Singleton-ilmentymän luomiseen ja alustamiseen. Jos useat säikeet yrittävät luoda Singletonin samanaikaisesti, se voi johtaa kilpailuolosuhteisiin.
- Rajoitettu laajennettavuus: Singleton-kuvio voi tehdä koodista vähemmän laajennettavan. Jos päätät myöhemmin, että tarvitset useita luokan esiintymiä tai haluat muuttaa ilmentämislogiikkaa, se voi vaatia merkittävää uudelleenjärjestelyä.
- Globaali riippuvuus: Singleton-kuvio luo globaalin riippuvuuden, mikä vaikeuttaa Singletonin korvaamista vaihtoehtoisella toteutuksella tai riippuvuuslisäyksen käyttämistä ilmentymien tarjoamiseen.
- Vaikea alaluokkaan: Singletonin alaluokittelu voi olla haastavaa. Koska rakentaja on tyypillisesti yksityinen, Singletonin laajentaminen vaatii lisähoitoa, eikä se välttämättä noudata tavallisia perintömalleja.
- Elinkaarihallinta: Singleton-malli ei välttämättä käsittele skenaarioita, joissa ilmentymä on nimenomaisesti tuhottava tai nollattava. Singletonin elinkaaren hallinta voi tulla huolenaiheeksi.
- Globaalin tukiaseman väärinkäyttö: Vaikka globaali tukiasema on etu, sitä voidaan myös käyttää väärin. Kehittäjät saattavat tuntea houkutusta käyttää Singletonia kaikkeen, mikä johtaa globaalin tilan liikakäyttöön ja vähemmän modulaariseen suunnitteluun.
10. Johtopäätös
On tärkeää, että joillakin luokilla on täsmälleen yksi esiintymä. Vaikka järjestelmässä voi olla useita tulostimia, tulostimen taustatulostin saa olla vain yksi. Saa olla vain yksi tiedostojärjestelmä ja yksi ikkunanhallinta. Digitaalisessa suodattimessa on yksi A/D-muunnin. Kirjanpitojärjestelmä on tarkoitettu palvelemaan yhtä yritystä. Kuinka varmistamme, että luokassa on vain yksi ilmentymä ja että ilmentymä on helposti saatavilla? Globaali muuttuja tekee objektista käytettävissä, mutta se ei estä sinua luomasta useita objekteja.
Parempi ratkaisu on asettaa luokka itse vastaamaan ainoan esiintymistään kirjaamisesta. Luokka voi varmistaa, että muuta ilmentymää ei voida luoda (sieppaamalla uusien objektien luomispyyntöjä), ja se voi tarjota tavan käyttää ilmentymää. Tämä on Singletonin malli.