Perché utilizzare lo schema Singleton su campi e funzioni di classe? [duplicare]

0

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.

    
posta Supuhstar 17.02.2015 - 03:21
fonte

1 risposta

-1

Prima di tutto, chiamare il metodo getMyObject() di Singleton2 causerà il crash del programma perché non crea una nuova istanza quando è nullo e restituirà null.

Secondo, non c'è getMyObject in una classe singleton. C'è solo getInstance() .

    
risposta data 17.02.2015 - 03:33
fonte