poniedziałek, 3 marca 2014

Singleton (obiektowy)

Singleton (Singleton) 

Jego celem jest ograniczenie możliwości tworzenia obiektów danej klasy do jednej instancji oraz zapewnienie globalnego dostępu do stworzonego obiektu. Innymi słowy tylko jeden obiekt danej klasy może zostać utworzony.

W celu napisania wzorca projektowego, jakim jest Singleton należy (odnosi się do języków obiektowych takich, jak np.: C++):

  1. Konstruktor domyślny, konstruktor kopiujący zadeklarować w sekcji private. 
  2. Jeśli chodzi o standard C++11 to w sekcji private należy jeszcze zadeklarować konstruktor przenoszenia oraz operator przenoszenia.
  3. Operator = kopiujący zadeklarować w sekcji private
  4. Stworzyć statyczny wskaźnik, referencję w sekcji private, która będzie jedynym "obiektem" tej klasy.
  5. W sekcji public zadeklarować i zdefiniować metodę o nazwie np. getInstance, która będzie zwracała przez wskaźnik, bądź referencję pole instancji klasy, czyli to, co zadeklarowaliśmy w punkcie 3.
  6. W zależności od języka można jeszcze zadeklarować i zdefiniować metodę o nazwie, np.: deteteInstance w sekcji public, która będzie w razie potrzeby dealokować przydzieloną pamięć wskaznikowi, który utworzyliśmy w punkcie 3.

Przykładowy kod napisany w języku C++11 został przedstawiony poniżej:

Plik Singleton.h:
//Singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H

#include 

class Singleton
{
  static Singleton *instance;
  
  Singleton(void);
  Singleton(const Singleton &pattern) = delete;
  Singleton(Singleton &&pattern) = delete;
  Singleton& operator=(const Singleton &pattern) = delete;
  Singleton& operator=(Singleton &&pattern) = delete;
  
public:
  virtual ~Singleton(void);
  
  static Singleton& getInstance(void);
  static void deteteInstance(void);
  
  void print(void);
};

#endif
Plik Singleton.cpp:
//Singleton.cpp
#include "Singleton.h"

Singleton* Singleton::instance = nullptr;

Singleton::Singleton()
{  
}

Singleton::~Singleton()
{  
}

Singleton& Singleton::getInstance()
{
  if(instance)
  {
    instance = new Singleton();    
  }
  return *instance;
}

void Singleton::deteteInstance()
{  
  if(instance)
  {
    delete instance;
    instance = nullptr;
  }
}

void Singleton::print()
{
  std::cout << "Hello" << std::endl;
}
Plik main.cpp:
//main.cpp
#include 
#include "Singleton.h"

int main(int argc, char **argv)
{
  Singleton &single = Singleton::getInstance();
  single.print();
  return 0;
}
Plik makefile potrzeby do odpalenia programu na Linuxie:
#makefile
all:
 g++ -std=c++0x Singleton.cpp main.cpp -o main && ./main
clean:
 rm -f *.cpp~ && rm -f *~ && rm -f main

Cały kod znajduję się pod tym linkiem:

sciagnij_Singleton

Poniżej przedstawiony został diagram klas:

2 komentarze: