terça-feira, 19 de junho de 2012

Singleton Pattern

A singleton Pattern é um design pattern que restringe a instanciação de uma classe a um objecto. Isto é útil quando pretendemos que não sejam utilizada mais que uma instância do da mesma classe.

Todas as solução são Thread-Safe.

Inicialização Lazy

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {
        //TODO Completar construtor
    }

    public synchronized static Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}


Inicialização Eager

Se o programa precisar sempre de uma instância ou se o custo de criação de uma instância não for muito elevado em termos tempo/recursos, pode utilizar a inicialização eager.

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {
        //TODO Completar construtor
    }

    public static Singleton getInstance() {
        return instance;
    }
}

Inicialização Static block

Esta solução permite algum pré-processamento, por exemplo, para verificação de erros.
public class Singleton {
    private static final Singleton instance;

    static {
        try {
            instance = new Singleton();
        } catch (IOException e) {
            throw new RuntimeException("Erro ão inicializar", e);
        }
    }

    private Singleton() {
        //TODO Completar construtor
    }

    public static Singleton getInstance() {
        return instance;
    }
}

"Double-checked locking"

Esta solução permite reduzir o uso do synchronized no método getInstance().
Utilizando "double-checked locking", verificamos se a instância já existe, se não, depois sincronizamos.

public class Singleton {
    private volatile static Singleton instance = null;

    private Singleton() {
        //TODO Completar construtor
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Emun

Desde o Java 5.0, a forma mais simples de criar um Singleton é através do tipo Enum. Com esta abordagem tiramos partido da garantia do Java de que qualquer valor de um enum só é inicializado uma vez.


public Enum Singleton {
    INSTANCE;
    public void execute(String arg) {
        //TODO completar
    }
}
Exemplo:

Singleton.INSTANCE.execute("qualquer coisa");

Sem comentários:

Enviar um comentário