I. Antecedentes

  A modo de reciente dise?o del estudio, véase Singleton, empecé a pensar mucho sobre el patrón Singleton directamente, y también muy fácil de implementar, pero en realidad el patrón Singleton tiene varias variantes, y de múltiples subprocesos implicados cuestiones de hilo de seguridad, entonces este artículo vamos a tener un conjunto unitario de chat, hablar de las tres formas en que un clásico: un estilo de hombre hambriento, tipo flojo, tipo de registro.Y para deshacerse de los problemas multithreading hilo de seguridad que puedan surgir.

  En segundo lugar, el concepto básico

  1.?Por qué utilizar Singleton?

  En nuestro trabajo diario, muchos objetos en general ocupan un muy importantes recursos del sistema, tales como: procesamiento de IO, las operaciones de bases de datos, etc., entonces tenemos que restringir estos objetos sólo y siempre utilizar un ejemplo común, que un solo caso.

  2.implementaciones de patrones Singleton

  Constructor privatización, para evitar que otros tipos de generación de instancia ejemplo común único de una externa.Y la clase Singleton debe definirse como final, es decir la clase Singleton no se puede heredar, porque si se le permite a la mente hereda la que se pueden crear subclases ejemplo, en contra de la instancia única de la clase.

  variable estática Clase para sostener una sola instancia de una referencia.

  Hay un método estático para obtener una referencia a una sola instancia de.

  3.diagrama de clase UML Singleton

  

  4.implementación patrón único clásica

  Hambre de estilo chino: principio para crear un buen ejemplo, cada llamada de retorno directo, el clásico "Take espacio de tiempo.".

  Tipo de Lazy: carga diferida, cuando se cargó la primera llamada, y luego regresar después de cada llamada de retorno directo.Clásico "Tómese el tiempo para el espacio," entorno multi-hilo debe prestar atención a resolver los problemas de seguridad hilo.

  Tipo de registro: para un grupo de modo de único de mantenimiento, principalmente en el número de extensiones, mediante mapaa de procesos de fallos para un solo caso de depósito en, por lo que cuando se llama, en primer lugar determinar si el único se ha creado, se devuelve directamente no está registrado, a continuación, crear un mapa, y luego regresar.

  En tercer lugar, el estilo hombre hambriento --- implementación del código

  1.único

  empaquetar com.Hafiz.patrón de dise?o.único;

  public clase {Singleton1

  // Crear una variable estática global para asegurar que sólo una instancia

  estático privado volátil ejemplo Singleton1 = nuevo Singleton1 ();

  Singleton1 privada () {

  // constructor de la privatización

  Sistema.fuera.el println ( "- hombre hambriento modo de llamada única realización constructor -");

  }

  public static Singleton1 getInstance () {

  Sistema.fuera.la println ( "- Método estático Invocación de hambre modo de realización solo devuelve una instancia -");

  volver ejemplo;

  }

  }

  2.Categoría de prueba

  DesignPatternTest public clase {

  @Prueba

  testSingleton1 public void () {

  Sistema.fuera.println ( "----------------- sola prueba de hambre -------------- realización de inicio del modo");

  Singleton1 instance1 = Singleton1.obtener Instancia ();

  Sistema.fuera.la println ( "segundo ejemplo Get");

  Singleton1 instance2 = Singleton1.obtener Instancia ();

  Sistema.fuera.println ( "instance1 y si el mismo instance2 instancia?"+ (Instance2 Instance1 ==));

  Sistema.fuera.println ( "----------------- hambrientos modo de prueba solo se terminó -------------- realización");

  }

  }

  3.Resultados de la prueba

  

  En cuarto lugar, el perezoso --- implementación del código

  1.único

  empaquetar com.Hafiz.patrón de dise?o.único;

  public class {Singleton2

  // Crear una variable estática global para asegurar que sólo una instancia

  estático privado ejemplo Singleton2 = null;

  // constructor de la privatización

  Singleton2 privada () {

  Sistema.fuera.la println ( "- método constructor se llama modo de realización única perezoso -");

  }

  public static Singleton2 getInstance () {

  Sistema.fuera.la println ( "- llamada en modo idler realización única adquisición de Ejemplo -");

  si (ejemplo == null) {

  Sistema.fuera.la println ( "- ejemplo de realización de rodillo sencillo no se crea, crear de nuevo -");

  instancia = nuevo Singleton2 ();

  }

  volver ejemplo;

  }

  }

  2.Categoría de prueba

  DesignPatternTest public class {

  @Prueba

  testSingleton2 public void () {

  Sistema.fuera.println ( "----------------- perezoso sola inicio modo de prueba -------------- realización");

  Singleton2 instance1 = Singleton2.obtener Instancia ();

  Sistema.fuera.la println ( "segundo ejemplo Get");

  Singleton2 instance2 = Singleton2.obtener Instancia ();

  Sistema.fuera.println ( "instance1 y si el mismo instance2 instancia?"+ (Instance2 Instance1 ==));

  Sistema.fuera.println ( "----------------- modo de prueba solo perezoso se terminó -------------- realización");

  }

  }

  3.Resultados de la prueba

  

  estudiantes cuidadosos han encontrado que la aplicación, en un entorno multi-hilo, hay una serie de cuestiones de seguridad compatibles con el proceso, puede haber dos o más hilos son juzgados ejemplo es nulo, a continuación, crear varias veces ejemplo, no cumple con la sola pensamientos ejemplo, podemos mejorarlo.

  V. Mejora código perezoso para la fórmula 1 ---

  Principio: Uso sincronizado bloque sincronizado JDK para resolver los problemas de hilo de seguridad del hombre perezoso.

  1.único

  empaquetar com.Hafiz.patrón de dise?o.único;

  public class {Singleton2

  // Crear una variable estática global para asegurar que sólo una instancia

  estático privado ejemplo Singleton2 = null;

  // constructor de la privatización

  Singleton2 privada () {

  Sistema.fuera.la println ( "- método constructor se llama modo de realización única perezoso -");

  }

  public static Singleton2 getInstance () {

  Sistema.fuera.la println ( "- llamada en modo idler realización única adquisición de Ejemplo -");

  si (instancia != NULL) {

  Sistema.fuera.la println ( "- de instancia única rueda loca realización se ha creado, volver directamente -");

  volver ejemplo;

  }

  sincronizado (Singleton2.clase) {

  si (ejemplo == null) {

  Sistema.fuera.la println ( "- ejemplo de realización de rodillo sencillo no se crea, crear de nuevo -");

  instancia = nuevo Singleton2 ();

  }

  }

  volver ejemplo;

  }

  }

  2.Resultados de la prueba

  

  Desarrollar mejorado código perezoso para la Fórmula 2 ---

  Principio: Uso de JVM sincronización implícita y clases de nivel de clase internos para resolver, JVM sincronización implícita de varios subprocesos para resolver problemas de seguridad hilo, uso interno clase clase clase sólo cuando se carga la solución de problemas (carga lenta) de.

  1.Lo JVM sincronización implícita?

  inicializador estático (en un campo estático o estático {} estática inicializador bloque de código) datos de inicialización

  Cuando se accede a los campos finales

  Cuando se crea un objeto antes de crear un hilo

  Cuando se procesarán los objetos visibles hilo

  2.Lo que es las clases internas de nivel de clase?

  Hay modificación estática de los miembros de la clase interna estilo.Ninguna modificación estática de los miembros de la clase de tipo interno llamado nivel de las clases internas a objetos.

  clase de nivel de clase que corresponde a los componentes internos de su clase estática externa, no hay ninguna relación de dependencia entre los objetos con su objeto externo, y por lo tanto se pueden crear directamente, y los ejemplos de la clase interna nivel a objetos, se une a la instancia de objeto externo.

  De nivel de clase clase interna se puede definir métodos estáticos.Sólo podrá hacer referencia a una estática métodos miembro o variables miembro fuera de clase en un método estático

  miembros de nivel de clase de sus clases internas equivalentes a la clase externa, y sólo la primera vez que se utilizará será cargado

  3.único

  empaquetar com.Hafiz.patrón de dise?o.único;

  public class {Singleton3

  clase estática privada Singleton4 {

  private static ejemplo Singleton3;

  estática {

  Sistema.fuera.la println ( "- clase interna de nivel de clase se carga -");

  instancia = nuevo Singleton3 ();

  }

  Singleton4 privada () {

  Sistema.fuera.el println ( "- constructor de la clase llama a nivel de clase interna -");

  }

  }

  Singleton3 privada () {

  Sistema.fuera.println ( "- se llama al constructor -");

  }

  public static Singleton3 getInstance () {

  Sistema.fuera.println ( "- comenzó a llamar a un total de devuelve el método una instancia -");

  ejemplo Singleton3;

  Sistema.fuera.println ( "---------------------------");

  instancia = Singleton4.ejemplo;

  Sistema.fuera.la println ( "único retorno");

  volver ejemplo;

  }

  }

  4.Categoría de prueba

  empaquetar com.Hafiz.www;

  com importación.Hafiz.patrón de dise?o.observador.ConcreteObserver;

  com importación.Hafiz.patrón de dise?o.observador.ConcreteSubject;

  com importación.Hafiz.patrón de dise?o.único.Singleton1;

  com importación.Hafiz.patrón de dise?o.único.Singleton2;

  com importación.Hafiz.patrón de dise?o.único.Singleton3;

  com importación.Hafiz.patrón de dise?o.único.Singleton4;

  com importación.Hafiz.patrón de dise?o.singleton.Singleton4Child1;

  com importación.Hafiz.patrón de dise?o.singleton.SingletonChild2;

  importar org.junit.Prueba;

  DesignPatternTest public class {

  @Prueba

  testSingleton3 public void () {

  Sistema.fuera.println ( "----------------- probado mejorada perezoso -------------- única forma de realización de inicio del modo");

  Singleton3 instance1 = Singleton3.obtener Instancia ();

  Sistema.fuera.la println ( "segundo ejemplo Get");

  Singleton3 instance2 = Singleton3.obtener Instancia ();

  Sistema.fuera.println ( "instance1 y si el mismo instance2 instancia?"+ (Instance2 Instance1 ==));

  Sistema.fuera.println ( "----------------- probado mejorada perezoso extremo monomodo -------------- realización");

  }

  }

  5.Resultados de la prueba

  

  Siete, el tipo de registro - la implementación del código

  1.clase base

  empaquetar com.Hafiz.patrón de dise?o.único;

  java importación.util.Mapaa;

  java importación.util.concurrente.ConcurrentHashMap;

  public class {Singleton4

  Mapa estática privada map = new ConcurrentHashMap<>();

  Singleton4 protegido () {

  Sistema.fuera.println ( "- constructor de la privatización se llama -");

  }

  public static Singleton4 getInstance (String nombre) {

  si (nombre == null) {

  name = Singleton4.class.getName ();

  Sistema.fuera.println ( "- nombre está vacío, la asignación por defecto es: -" + Singleton4.class.getName ());

  }

  si (mapa.obtener (nombre) != NULL) {

  Sistema.fuera.( "Existe valor correspondiente nombre, el retorno directo") println;

  mapa de retorno.obtener (nombre);

  }

  Sistema.fuera.println ( "nombre correspondiente al valor no existe, crear, y luego volver a");

  tratar {

  Singleton4 resultado = (Singleton4) Clase.forName (nombre).nueva instancia ();

  map.poner (nombre, resultado);

  return resultado;

  } Catch (InstantiationException e) {

  e.printStackTrace ();

  } Catch (IllegalAccessException e) {

  e.printStackTrace ();

  } Catch (ClassNotFoundException e) {

  e.printStackTrace ();

  }

  nula regresar;

  }

  Mapa pública getMap () {

  Mapa de retorno;

  }

  }

  2.subclase 1

  empaquetar com.Hafiz.patrón de dise?o.único;

  public class Singleton4Child1 extiende Singleton4 {

  public static Singleton4Child1 getInstance () {

  retorno (Singleton4Child1) Singleton4.getInstance ( "com.Hafiz.patrón de dise?o.singleton.Singleton4Child1 ");

  }

  }

  3.2 subclase

  empaquetar com.Hafiz.patrón de dise?o.único;

  public class SingletonChild2 extiende Singleton4 {

  public static SingletonChild2 getInstance () {

  retorno (SingletonChild2) Singleton4.getInstance ( "com.Hafiz.patrón de dise?o.singleton.SingletonChild2 ");

  }

  }

  4.Categoría de prueba

  DesignPatternTest public class {

  @Prueba

  testSingleton4 public void () {

  Sistema.fuera.println ( "----------------- registro único ensayo de arranque en modo -------------- realización");

  Sistema.fuera.println ( "hecha la primera instancia");

  Singleton4 instance1 = Singleton4.getInstance (null);

  Sistema.fuera.println ( "res:" + Instance1);

  Sistema.fuera.la println ( "segundo ejemplo Get");

  Singleton4Child1 instance2 = Singleton4Child1.obtener Instancia ();

  Sistema.fuera.println ( "res:" + Instance2);

  Sistema.fuera.el println ( "tercera instancia Get");

  SingletonChild2 instance3 = SingletonChild2.obtener Instancia ();

  Sistema.fuera.println ( "res:" + instance3);

  Sistema.fuera.el println ( "Obtener Cuarto ejemplo");

  SingletonChild2 instance4 = new SingletonChild2 ();

  Sistema.fuera.println ( "res:" + instance4);

  Sistema.fuera.el println ( "Salida de Mapa de los padres en todo sola realización");

  Map MAP = instancia1.getMap ();

  para (Mapa.Entrada material: mapa.entrySet ()) {

  Sistema.fuera.println ( "mapa-tema:" + elemento.getKey () + "=" + elemento.la getValue ());

  }

  Sistema.fuera.println ( "instance1 y si el mismo instance2 instancia?"+ (Instance2 Instance1 ==));

  Sistema.fuera.println ( "----------------- modo de registro de prueba solo se terminó -------------- realización");

  }

  }

  5.Resultados de la prueba

  

  Una desventaja de esta solución: la subclase constructor de la clase de base da a conocer un consejo (protegida), una buena solución puede ser discutido ~ Hirotomo

  Ocho, resumen

  Después de este artículo, entendemos qué patrón Singleton, la forma de lograr la elegancia clásica del patrón Singleton, la forma de ampliar y desarrollar Singleton seguro para subprocesos.Para nuestro desarrollo futuro es muy útil, háganoslo saber más acerca de Singleton.

  Eso es todo por este artículo, quiero ser útil para aprender, espero que usted apoyará guión Inicio.

  Usted también puede estar interesado en el artículo: ?Por qué patrón Singleton en Java que sólo lo recomendaría dos nueve clases de Java Singleton detallado (recomendado) de Java de bloqueo doble comprobación explicar únicos Java multi-hilo ejemplos reales de Singleton y múltiples hilos ejemplos explican Java Java Java únicos correcta implementación detallada de un patrón de dise?o Singleton patrón de dise?o detallado

?Sabmi rmialmminte Java Singleton todavía?

Recommend Article: