O modelo Singleton é o modelo de design mais simples entre os 23 modelos de design e também é amplamente utilizado no desenvolvimento corporativo. A vantagem do padrão Singleton é que há apenas uma instância no projeto.
Recursos: o construtor é privatizado, o objeto é privatizado e fornece apenas uma interface de acesso externa.
Cenários de aplicativos:
1. O sistema precisa compartilhar recursos: como sistema de log, gerente de recursos de mola, etc.
2. Para controlar o uso de recursos: como pool de threads
Aplicações comuns no desenvolvimento de nível corporativo e estruturas comuns:
Servlets no J2EE, gerentes de recursos na primavera (ou seja, feijões), pools de conexão de banco de dados, pools de threads, sistemas de log, balcões de sites etc.
Classificação de padrões de singleton:
1. Modo faminto: o modo faminto é o modo mais simples de singleton para código, mas a instância é carregada quando a classe é inicializada. Se não for usado instantaneamente, o sistema será carregado. O código específico é o seguinte:
classe pública Singleton {private Static Singleton Instância = new Singleton (); private singleton () {} public static singleton getInstance () {retorna instância; }}2. Modo preguiçoso: comparado ao modo faminto, o modo preguiçoso é instanciado e colocado na única interface externa a ser processada, que realiza o atraso no tempo de inicialização do sistema, mas há uma situação em que os threads são inseguros.
classe pública singleton {private static singleton instance = null; private singleton () {} public static singleton getInstance () {if (instance == null) {return new singleton (); } Instância de retorno; }}3. Lock de verificação dupla: O modo de bloqueio de verificação dupla é na verdade uma atualização do modo preguiçoso, tornando o modo preguiçoso seguro. Nota: Existe um problema de memória com o bloqueio de verificação dupla, que pode invalidar o bloqueio de verificação dupla.
classe pública singleton {private static singleton instance = null; private singleton () {} public static singleton getInstance () {if (instance == null) {synchronized (singleton.class) {if (instance == null) {return new singleton (); }} retornar a instância; }}4 Modo de classe interna estática: a classe interna estática possui modos preguiçosos e malignos: carregamento atrasado e seguro para roscas.
classe pública Singleton {classe estática privada singletonfactory {private static singleton instance = new singleton (); } private singleton () {} public static singleton getInstance () {return singletonfactory.instance; }}5 Modo de classe de enumeração: deve ser o modo de interesse único mais perfeito, que não é apenas seguro de encadeamento, mas também impede os problemas de desigualdade e reflexão.
enum singleton {instance; public void Dosomething () {...}}Detalhes do padrão de singleton Problema:
1. A reflexão quebra o modo Singleton: a reflexão pode destruir a implementação do modo Singleton (exceto para o modo de enumeração)
/***Destroe o modo singleton por reflexão*/public classe Demons01 {public static void main (string [] args) lança exceção {singleton s1 = singleton.getInstance (); Singleton s2 = singleton.getInstance (); System.out.println (S1 == S2); Classe <Singleton> clazz = (classe <Singleton>) classe.ForName ("com.singleton.singleton"); Construtor <Singleton> construtor = clazz.getDecLaredConstructor (null); construtor.setAccessible (true); Singleton S3 = construtor.newInstance (); System.out.println (S1 == S3); }} classe singleton {private static singleton instance = new singleton (); Private Singleton () {// Método para impedir que a reflexão destrua o modo de interest único, abra a seção de comentários // if (instância! = null) {// lança new RunTimeException (); //}} public static singleton getInstance () {retorna instância; }}De fato, a chamada prevenção significa tornar impossível criar através da reflexão.
2. A desertalização quebra o padrão Singleton (exceto o padrão de classe de enumeração)
/*** A desertalização quebra o padrão singleton*/public classe Demo02 {public static void main (string [] args) lança exceção {singleton s1 = singleton.getInstance (); Singleton s2 = singleton.getInstance (); System.out.println (S1 == S2); FileOutputStream fos = new FileOutputStream ("d: //test.txt"); ObjectOutputStream ooS = new ObjectOutputStream (Fos); OOS.WriteObject (S1); OOS.Close (); fos.close (); ObjectInputStream ois = new ObjectInputStream (new FileInputStream ("d: //test.txt"); Singleton S3 = (Singleton) OIS.readObject (); System.out.println (S1 == S3); }} classe singleton implementa serializável {private static singleton instância = new singleton (); public static singleton getInstance () {retorna instância; } // Deserialização padrão, se o objeto já existir, esse método será chamado // objeto privado readResolve () lança objectStreamException {// Instância de retorno; // //}}Essas duas situações são limitadas à compreensão e não são muito usadas no processo de desenvolvimento real.
Neste ponto, o padrão Singleton está completo.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.