Wzorzec singletonu
Z Wikipedii
Wzorzec singletonu to w inżynierii oprogramowania jeden z wzorców projektowych należący do grupy wzorców konstrukcyjnych. Jest on przeznaczony do ograniczania możliwości tworzenia obiektów danej klasy do jednej instancji oraz zapewnienie globalnego punktu dostępu do niej.
Spis treści |
[edytuj] Problem
Często w aplikacji istnieje potrzeba stworzenia klasy, która posiadałaby wyłącznie jedną instancję. Zwykle związane to jest z zapewnieniem większej wydajności aplikacji, np. przy dostępie do bazy danych, gdzie każde łączenie się z bazą jest dla aplikacji kosztowne, bo wymaga czasochłonnego uwierzytelnienia i autoryzacji. W tym przypadku sensowniej jest stworzyć jeden obiekt przechowujący sesję połączenia i wykorzystać go do przesłania wielu zapytań.
Również w mniej krytycznych przypadkach korzystne jest stosowanie wzorca singletonu. Wskazówką do jego użycia jest sytuacja, gdy potrzebna jest wyłącznie jedna instancja obiektu, którą wywołuje wiele różnych części aplikacji. W takich przypadkach tworzenie obiektu, a następnie niszczenie go (lub pozostawianie do zniszczenia przez garbage collector) jest marnotrawstwem zasobów pamięci.
[edytuj] Rozwiązanie
Wzorzec singletonu implementuje się przez stworzenie klasy, która posiada statyczną metodę, która najpierw sprawdza, czy istnieje już instancja tej klasy - jeśli nie istnieje to tworzy ją - i następnie zwraca ją przez referencję. Instancja klasy jest przechowywana w prywatnym lub chronionym, statycznym polu, do którego dostęp ma tylko opisana wyżej metoda. Owa metoda dostępowa jest jedyną drogą pozyskania instancji obiektu singletonu - aby uniemożliwić tworzenie dodatkowych instancji w zwykły sposób, czyli przez wywołanie konstruktora, deklaruje się go jako prywatny lub chroniony.
Dodatkową korzyścią z zastosowania takiego rozwiązania jest to, że cały proces jest niewidoczny dla użytkownika i nie musi on wiedzieć, czy instancja istnieje czy też nie.
[edytuj] Kod w języku JAVA
public final class Singleton { private final static Singleton ourInstance = new Singleton(); public static Singleton getInstance() { return ourInstance; } private Singleton() { } }
[edytuj] Kod w PHP 5
class Singleton { private static $instance = null; public static function getInstance() { if( self::$instance == null ) self::$instance = new Singleton(); return self::$instance; } // Deklaracja prywatnego konstruktora - zastępuje domyślny konstruktor publiczny private function __construct() {} } //Utworzenie obiektu: $single = Singleton::getInstance();
[edytuj] Kod w języku ActionScript 3
package { public class Singleton { private static var singleton : Singleton
public static function getInstance() : Singleton { if ( singleton == null ) singleton = new Singleton( arguments.callee ); return singleton; }
//NOTE: AS3 nie pozwala na tworzenie prywatnych, czy chronionych konstruktorów public function Singleton( caller : Function = null ) { if( caller != Singleton.getInstance ) throw new Error ("Singleton is a singleton class, use getInstance() instead");
if ( Singleton.singleton != null ) throw new Error( "Only one Singleton instance should be instantiated" );
//reszta kodu tutaj } } }
[edytuj] Kod w języku C#
sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } static Singleton() { } public static Singleton Instance { get { return instance; } } }