Inizierò col dire che capisco che la programmazione in gran parte delle funzioni e delle variabili di classe può essere dannosa per l'orientamento agli oggetti e che la maggior parte delle volte si preferisce un'istanza. Userò Java come lingua per questa domanda, ma dovrebbe applicarsi a qualsiasi linguaggio che faccia la distinzione tra ambiti di classe e istanza.
Ma ci sono ancora momenti in cui è richiesta solo una singola istanza, che richiede lo schema Singleton:
public class Singleton1
{
private static Singleton1 instance;
private Object myObject;
private Singleton1()
{
myObject = new Object();
// other initializations here
}
public static getInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}
public Object getMyObject()
{
return myObject;
}
// and so on with the non-static public and private methods
}
Questo sarà usato come tale:
Singleton1 singleton1 = Singleton1.instance();
singleton1.getMyObject();
// any other method called like singleton1.method(args);
Questo modello forza i programmatori che utilizzano la classe Singleton1
a ottenere istanze tramite Singleton1.getInstance()
invece del solito new Singleton1()
, poiché l'unico costruttore è privato. Il vantaggio principale di questo è garantire che sia utilizzata una sola istanza di Singleton1
, e quindi ogni modifica risuona vera ovunque nel programma.
La mia domanda è, perché passare attraverso il rigamarole di mantenere il costruttore e l'istanza privata, quando il modificatore static
si occupa già di tutto questo? Vedi il mio esempio di contrappunto di seguito:
public class Singleton2
{
private static Object myObject;
static
{
myObject = new Object();
// other initializations here
}
private Singleton2(){/*nothing*/}
public static Object getMyObject()
{
return myObject;
}
// and so on with the static public and private methods
}
Questo sarà usato come tale:
Singleton2.getMyObject();
// any other method called like Singleton2.method(args);
Per me, questo mi sembra meno codice e più facile da seguire.