Singleton (wzorzec projektowy)/kod
Z Wikiźródeł, repozytorium wolnych materiałów źródłowych
| Singleton (wzorzec projektowy) Kod źródłowy |
|||
| Kody źródłowe programów stosujących wzorzec projektowy singletonu |
Spis treści |
[edytuj] Java
[edytuj] Rozwiązanie 1
public final class Singleton { private final static Singleton ourInstance = new Singleton(); public static Singleton getInstance() { return ourInstance; } //żeby uniknąć automatycznego tworzenia domyślnego, publicznego, bezargumentowego konstruktora private Singleton() { } }
[edytuj] Rozwiązanie 2 (tylko Java 5 i nowsza)
public final class Singleton { // należy zwrócić uwagę na użycie słowa kluczowego volatile private static volatile Singleton instance = null; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } // żeby uniknąć automatycznego tworzenia domyślnego, publicznego, bezargumentowego konstruktora private Singleton() { } }
[edytuj] Rozwiązanie 3
public class Singleton { //żeby uniknąć automatycznego tworzenia domyślnego, publicznego, bezargumentowego konstruktora protected Singleton() {} private static class SingletonHolder { private final static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }
[edytuj] PHP 5
<?php class Singleton { private static $instance; private function __construct() {} // Blokujemy domyślny konstruktor publiczny private function __clone(){} //Uniemozliwia utworzenie kopii obiektu public static function getInstance () { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } } // Pobieramy instancję $singleton = Singleton::getInstance(); ?>
[edytuj] ActionScript 3
[edytuj] Rozwiązanie 1
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] Rozwiązanie 2
package { public final class Singleton { private static var instance:Singleton = new Singleton(); public function Singleton() { if( instance ) throw new Error( "Dostęp do klasy jedynie za pośrednictwem metody Singleton.getInstance()" ); } public static function getInstance():Singleton { return instance; } } }
[edytuj] C#
[edytuj] Rozwiązanie 1
sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } static Singleton() { } public static Singleton Instance { get { return instance; } } }
[edytuj] Rozwiązanie 2 (dla C# 2.0 i nowszych)
public class Singleton<T> where T : class, new() { private static readonly object syncLock = new object(); private static T instance; protected Singleton() { } public static T Instance { get { if (instance == null) { lock (syncLock) { if (instance == null) { instance = new T(); } } } return instance; } } }
[edytuj] C++
//Definicja class singleton { private: singleton() {} singleton(const singleton &); singleton& operator=(const singleton&); public: string method() { return "singleton pattern"; } static singleton& getInstance() { //Inicjalizacja statycznego obiektu. //Obiekt zostanie utworzony przy pierwszym wywołaniu tej metody //i tylko wtedy nastąpi inicjalizacja przy pomocy konstruktora. //Każde następne wywołanie jedynie zwróci referencję tego obiektu. static singleton instance; return instance; } }; //Uzycie std::cout << singleton::getInstance().method();
[edytuj] Python
class Singleton(object): def __new__(type): if not '_instancja' in type.__dict__: type._instancja = object.__new__(type) return type._instancja # przykład a=Singleton() a.toto = 1234 b=Singleton() print b.toto b.toto = 4321 print a.toto # TAKIE SAME, ta sama instancja klasy print id(a),id(b)