Návrhový vzor singleton patří do základní výbavy každého programátora. Jeho podstatou je vytvoření pouze jedné instance bezestavového objektu, která se používá napříč celou aplikací. Díky tomu, že je značná část tříd z principu bezestavová (data access objecty, service objekty atp.), se dá tímto způsobem ušetřit značné množství paměti.


Kód

 /**
  * Singleton, ktery se zinicializuje pri nacteni tridy
  * @author Pavel Micka
  */
 class EagerSingleton{
     /**
      * Staticka promenna zajisti EAGER inicilizaci (pri nacteni tridy)
      */
     public static final EagerSingleton SELF = new EagerSingleton();
     /**
      * Skryty konstuktor => Nelze tvorit dalsi instance
      */
     private EagerSingleton(){}
     /**
      * Testovaci metoda
      */
     public void foo(){
         System.out.println("foo");
     }
 }
 /**
  * Singleton s on-demand inicializaci
  * @author Pavel Micka
  */
 class LazySingleton{
     /**
      * Samotny objekt
      */
     private static LazySingleton self;
     /**
      * Skryty konstuktor => Nelze tvorit dalsi instance
      */
     private LazySingleton(){};
     /**
      * Lazy inicializace singletonu (az pri prvnim pozadavku), metoda
      * musi byt synchronizovana (aby byla zajistena bezpecnost pristupu
      * vice vlaken)
      * @return singleton
      */
     public static synchronized LazySingleton getInstance(){
         if(self == null){
             self = new LazySingleton();
         }
         return self;
     }
     /**
      * Testovaci metoda
      */
     public void foo(){
         System.out.println("foo");
     }
 }
 

Singleton od verze Java 5 může být vytvořen i pomocí konstrukce výčtového typu Enum:


Kód

  /**
  * Singleton pomocí výčtu ENUM
  * @author Pavel Stančík
  */
enum Singleton
{
    INSTANCE;

// proměnné instance, konstruktor
    private final Connection connection;

    Singleton()
     {
        // Inicializace např. připojení k databázi
        connection = DB.getConnection();
     }

// Statický getter
    public static Singleton getInstance()
    {
        return INSTANCE;
    }

    public Connection getConnection()
    {
        return connection;
    }
}
     //Následně můžeme zavolat instanci singletonu
     final Singleton s = Singleton.getInstance()

     

Tento typ singletonu je automaticky thread-safe, jelikož hodnota výčtového typu enum se inicializuje pouze jednou. Bohužel, pokud v tomto výčtovém typu voláte metodu, která thread-safe není, vznikne problém, v tom případě je nutné použít v definici metody klíčové slovo synchronized, vznikne synchronizovaná metoda, která nedovolí modifikovat předchozí inicializovaný objekt, dokud jej zpracovává předchozí vlákno. Jakmile jej první vlákno uvolní, dostane se ke slovu vlákno další.

Literatura

  • PECINOVSKÝ, Rudolf. Návrhové vzory. 1. vyd. [s.l.] : Computer press, 2007. 527 s. ISBN 978-80-2511582-4.







Doporučujeme