Søger du en specifik kategori?

 



Oprettet tor. d. 05. februar 2009 kl. 21:22

arne_v
arne_v (1.016.094 point)
Guidens karaktér
1
2
3
4
5

Singleton pattern i C++

Denne artikel beskriver Singleton pattern og implementation i C++. Den forudsætter kendskab til C++ men ikke til Singleton.
Historie:
V1.0 - 12/01/2004 - original
V1.1 - 31/01/2004 - forbedret formatering + tilføje private copy constructor
Teori
Singleton pattern løser problemet med at man kun vil
have en enkelt instans af en given klasse.

Singleton pattern er en god objekt orienteret løsning på
samme problem som løses ikke objekt orienteret via en
klasse med kun static members og methods.

Singleton pattern er et såkaldt GoF pattern, hvilket
refererer til bogen "Design Patterns" af Erich Gamma, Richard Helm,
Ralph Johnson og John Vlissides (4 forfattere = Gang Of Four = GoF).

Kendetegnene ved en singleton klasse er:
  - public static metode Instance
  - private constructor
(den original GoF kode bruger protected constructor og det kan
man også godt, men min erfaring er at man ikke kan arve fra en
singleton klasse på fornuftig vis)

Eksempel
Her er et standard eksempel på en singleton klasse:

S.h

#include <vector>

using namespace std;

// singleton klasse
class S
{
  private:
      // normale attributter eksemplificeret ved en vector af string
      vector<string> *_list;
      // den eneste instas der eksisterer
      static S *_instance;
      // private constructor
      S();
      // private copy constructor to override default one
      S(const S& s) { };
  public:
      // public static metode til at hente instance
      static S *Instance();
      // normale metoder
      void Add(string s);
      vector<string> *List();
};


S.cpp

#include <vector>
#include <string>
#include <cstdlib>

using namespace std;

#include "S.h"

// initialiser instance til NULL
S *S::_instance = NULL;

// implementer constrctor
S::S()
{
  _list = new vector<string>();
}

// implementer getinstance
S *S::Instance()
{
  if(_instance == NULL)
  {
      _instance = new S();
  }
  return _instance;
}

// implementer normale metoder
void S::Add(string s)
{
  _list->push_back(s);
}

vector<string> *S::List()
{
  return _list;
}


Klassen kan bruges som følger:

#include <iostream>
#include <vector>
#include <cstdlib>

using namespace std;

#include "S.h"

int main()
{
  S *a = S::Instance();
  a->Add("A");
  S *b = S::Instance();
  b->Add("B");
  S *c = S::Instance();
  vector<string> *v = c->List();
  for(int i = 0; i < v->size(); i++)
  {
      cout << v->at(i).c_str() << endl;
  }
  return EXIT_SUCCESS;
}


Singleton i multithreaded kontekst
Bemærk at i en multithreaded kontekst bør man kode sin
singleton klasse så man undgår samtidigheds problemer.
Der er ingen standard for hvordan man gør det i C++
(Windows og POSIX har hver sin måde), så jeg vil undlade at
vise eksempler på dette.

Skrevet ons. d. 14. januar 2004 kl. 20:19| #1


Skrevet fre. d. 23. januar 2004 kl. 22:50| #2

driis (61.122 point)
www.driis.dk
Udmærket artikel, men jeg vil gerne påpege at copy constructoren også bør erklæres private - ellers kan man stadig oprette 2 objekter af klassen, f.eks.:

int main()
{
    S * a = S::Instance();
    S b = *a;
   
    cout << "Object a addresse: " << a << endl
        <<  "Object b addresse: " << &b << endl;

    return 0;
}

Skrevet fre. d. 21. april 2006 kl. 22:22| #3


Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
14 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   



   




Tips & Tricks fra PC World

Teaser billede

Top 5: Virale YouTube-videoer fra Danmark

Lægger du mærke til de mere eller mindre skjulte reklamebudskaber, når du ser videoer på nettet? Vi har taget et kig på fem utrolige danske videoer, som er blevet virale hit.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan fupper smarte svindlere dig på Facebook

Se hvordan du undgår Facebook-fup i fremtiden.


Nyheder fra Computerworld

Teaser billede

App-udvikling 2.0: Sådan er den perfekte app

ComputerViews: Den værste app-hype er ved at have lagt sig, og nu ser vi konturerne af fremtidens app-design. Men hvordan udnytter man de mobile muligheder optimalt?


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger