Singleton (wzorzec projektowy)/kod

Z Wikiźródeł, repozytorium wolnych materiałów źródłowych


Singleton (wzorzec projektowy) • Kod źródłowy
Singleton (wzorzec projektowy)
Kod źródłowy
Kody źródłowe programów stosujących wzorzec projektowy singletonu
Wikipedia
Zobacz w Wikipedii hasło Singleton


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)