Latest web development tutorials

Padrão Singleton

Singleton (Pattern Singleton) Java é uma das o padrão de design mais simples. Este tipo de padrões de projeto pertencem criar esquema, que fornece a melhor maneira de criar objetos.

Este modelo envolve uma única classe que é responsável por criar seus próprios objetos, assegurando que apenas um único objeto é criado. Essa classe fornece um objeto único de sua visita, ele pode ser acessado diretamente, você não precisa instanciar um objeto da classe.

Nota:

  • 1, classe Singleton pode ter apenas uma instância.
  • 2, classe singleton deve criar sua própria instância única.
  • 3, única classe deve fornecer este exemplo para todos os outros objetos.

introdução

Intenção: para garantir que apenas uma instância de uma classe, e fornecer um ponto de acesso global para acessá-lo.

A principal solução: usar uma classe mundial freqüentemente criados e destruídos.

Quando usar: Quando você quiser controlar o número de casos em que, para economizar recursos do sistema.

Como resolver: determinar se o sistema já tem esse único caso, se ele retorna, se não, então criado.

O código da chave: o construtor é privado.

Exemplos de aplicação: 1, uma parte só pode ter um presidente.2, Windows é um multi-processo, multi-threaded, na operação de um arquivo quando ele inevitavelmente vários processos ou threads simultaneamente um documento do fenômeno, o processamento de todos os arquivos devem ser executadas por uma instância única. 3, parte do gerente do equipamento é muitas vezes concebido como um modelo de caso único, tal como um computador com duas impressoras na saída quando necessário para lidar com duas impressoras não é possível imprimir o mesmo arquivo.

Vantagens: 1, apenas uma instância na memória, reduzindo a sobrecarga de memória, especialmente frequentes criar e destruir instâncias (como School of Management Início cache de página).2, para evitar múltipla ocupação de recursos (como operações de gravação de arquivos).

Contras: nenhuma interface, não herda, e única responsabilidade princípio de conflito, uma classe só deve estar preocupado com a lógica interna, não no exterior como forma de instanciar.

cenários de uso: 1, exigir a apresentação de um número de série único.2, contador de visitas, nem todos os banco de dados em Riga uma vez com um único caso para refrescar em cache. 3, um objeto criado pela necessidade de consumo excessivo de recursos, tais como I conexão / S para o banco de dados e assim por diante.

Nota: getInstance () método requer a utilização de sincronização de bloqueio sincronizado (Singleton.class) para impedir vários segmentos para a instância causa é instanciado várias vezes.

realização

Vamos criar uma classeSingleObject.classeSingleObjecttem sua própria construtor privado e uma instância estática.

classeSingleObjectfornece um método estático para a obtenção de fora de sua instância estática.SingletonPatternDemo,nossas aulas de demonstração usando classSingleObjectpara obter objetoSingleObject.

Singleton padrão UML diagrama

passo 1

Crie uma classe Singleton.

SingleObject.java

SingleObject classe pública {

   // Cria um objeto SingleObject exemplo SingleObject private static = new SingleObject ();

   // Faz construtor privado, de modo que a classe não será instanciado SingleObject privada () {}

   // Obter o único objeto de público disponível estática SingleObject getInstance () {
      retornar instância;
   }

   showMessage public void () {
      System.out.println ( "Olá mundo!");
   }
}

passo 2

Obter objeto único da classe Singleton.

SingletonPatternDemo.java

SingletonPatternDemo classe pública {
   main (String [] args) public static void {

      // Construtor // ilegal de erro de tempo de compilação: Construtor SingleObject () não é visível // SingleObject objeto = new SingleObject ();

      // Obter o único objeto objeto disponível SingleObject = SingleObject.getInstance ();

      // Exibir mensagem object.showMessage ();
   }
}

passo 3

Verifique saída.

Olá mundo!

Vários implementação padrão Singleton

Implementar padrão Singleton um número de maneiras, como se segue:

1, estilo preguiçoso, thread-safe

São inicialização lenta: Sim

São seguros multi-thread: Não

Alcançar Dificuldade: Fácil

Descrição: Este método é a forma mais básica para conseguir esta implementação, o maior problema não é suporte multi-threading.Porque não há nenhum bloqueio sincronizado, de modo que o sentido estrito não é um solteirão.
carregamento lento, desta forma, obviamente, não exige a segurança do thread, o trabalho em um ambiente multi-threaded não funciona.

exemplos de código:

public class Singleton {  
    instância Singleton estática privado;  
    Singleton privada () {}  
  
    public static Singleton getInstance () {  
    if (exemplo == null) {  
        instance = new Singleton ();  
    }  
    retornar instância;  
    }  
}  

A próxima apresentação de várias implementações apoiar vários segmentos, mas diferem no desempenho.

2, estilo preguiçoso, thread-safe

São inicialização lenta: Sim

São seguros multi-thread: Sim

Alcançar Dificuldade: Fácil

Descrição: desta maneira tem uma boa carregamento lento, pode funcionar bem em um ambiente multi-fio, no entanto, é muito baixa eficiência, 99% dos casos não exige sincronização.
Vantagem: A primeira chamada foi inicializado, para evitar desperdício de memória.
Contras: deve ser bloqueado sincronizado para garantir um único caso, mas o bloqueio vai afetar a eficiência.
getInstance () o desempenho do aplicativo não é crítico (que usam menos freqüentemente).

exemplos de código:

public class Singleton {  
    instância Singleton estática privado;  
    Singleton privada () {}  
    public static sincronizado Singleton getInstance () {  
    if (exemplo == null) {  
        instance = new Singleton ();  
    }  
    retornar instância;  
    }  
} 

3, a fórmula de fome

São a inicialização lenta: Não

São seguros multi-thread: Sim

Alcançar Dificuldade: Fácil

Descrição: É mais comum, mas propenso a objetos de lixo.
Vantagens: não bloqueado, a eficiência é melhorada.
Desvantagens: carregador de classe é inicializado, a memória é desperdiçado.
Baseia-se no mecanismo de classloder evita multithreading sincronização, no entanto, exemplo, quando ele é instanciado carregador de classe, embora a classe causa o carregamento de uma variedade de razões, a maior parte do padrão Singleton é chamar o método getInstance, mas não pode ser determinada há outras maneiras (ou outros métodos estáticos) leva ao carregamento de classe, desta vez aparentemente não atingiram inicialização de instância efeito carregamento lento.

exemplos de código:

public class Singleton {  
    estática instância privada Singleton = new Singleton ();  
    Singleton privada () {}  
    public static Singleton getInstance () {  
    retornar instância;  
    }  
}  

4, bloqueio duplo check / bloqueio duplo controlo (DCL, que é bloqueio com verificação dupla)

versão JDK: jdk1.5 de

São inicialização lenta: Sim

São seguros multi-thread: Sim

Perceber a dificuldade: mais complexo

Descrição: Este método usa o mecanismo de bloqueio duplo, de segurança e, no caso da multi-tarefa para manter um alto desempenho.
getInstance () desempenho de aplicações é crítico.

exemplos de código:

public class Singleton {  
    privada voláteis Singleton Singleton estático;  
    Singleton privada () {}  
    public static Singleton getSingleton () {  
    if (singleton == null) {  
        sincronizado (Singleton.class) {  
        if (singleton == null) {  
            Singleton = new Singleton ();  
        }  
        }  
    }  
    voltar Singleton;  
    }  
}  

5, tipo de registro / classes internas estáticas

São inicialização lenta: Sim

São seguros multi-thread: Sim

Perceber a dificuldade: Geral

Descrição: Este método pode alcançar o modo de bloqueio duplo de verificação mesmo efeito, mas a implementação mais fácil.Use a inicialização lenta de campo estático deve ser usado desta forma, em vez de dupla verificar o modo de bloqueio. Isso só se aplica ao caso de um campo estático, verifique o modo de bloqueio pode ser usado quando necessário demora para inicializar campos de instância.
Esta abordagem também tira proveito dos mecanismos classloder para garantir que apenas um thread inicialização de instância, é com 3 formas diferentes é: enquanto a terceira via classe Singleton é carregado, a instância é instanciado (carregamento lento não chegou efeito), mas esta abordagem é a classe Singleton é carregado, instância não pode ser inicializado. Porque a classe SingletonHolder não é usado ativamente, exibida somente através do método chamada getInstance, aparece carregado classe SingletonHolder, o qual passa a instância. Imagine, se você criar instância uso intensivo de recursos, por isso queria atrasar o carregamento, por outro lado, quando você não quer instanciar carregador de classe Singleton, porque não pode garantir a classe Singleton também podem ser ativos em outras áreas de modo a ser carregado, desta vez para instanciar instância claramente inadequada. Desta vez, desta maneira em relação aos três primeiros tipos de formas, é muito razoável.

exemplos de código:

public class Singleton {  
    SingletonHolder classe estática privada {  
    private static final Singleton INSTÂNCIA = new Singleton ();  
    }  
    Singleton privada () {}  
    public static final de Singleton getInstance () {  
    voltar SingletonHolder.INSTANCE;  
    }  
}   

6, enumerar

versão JDK: jdk1.5 de

São a inicialização lenta: Não

São seguros multi-thread: Sim

Alcançar Dificuldade: Fácil

Descrição: Esta implementação ainda não foi amplamente adotado, mas esta é a melhor forma de implementar o padrão singleton.É mais concisa mecanismo de suporte a serialização, automático para evitar que várias instâncias do absoluto.
Esta abordagem é autor Effective Java Josh Bloch defende uma forma que não só pode evitar problemas de sincronização multi-thread, mas também suporta automaticamente mecanismo de serialização para evitar desserialização re-criar um novo objeto, absolutamente evitar múltipla instanciação. No entanto, uma vez que apenas se juntou depois de propriedades de enum jdk1.5, escrever dessa maneira não pode deixar de se sentir estranho, na prática, raramente usado.
Não por ataque de reflexão para chamar o construtor privado.

exemplos de código:

public enum Singleton {  
    Instância;  
    whateverMethod public void () {  
    }  
}  

Regra de ouro: Em circunstâncias normais, não recomenda o uso do primeiro tipo e a maneira preguiçosa segundo tipo, é recomendado o uso de terceira via um homem com fome.Somente quando você deseja implementar efeito carregamento lento é clara, vamos usar os cinco primeiros tipos de maneiras de se inscrever. Se se trata de desserializar objetos para criar, você pode tentar usar o modo de enumeração sexto. Se você tem outras necessidades especiais, você pode considerar o uso de uma quarta verifique o modo de bloqueio.