patrón de diseño (5) - Singleton

Modo Singleton (Singleton) para asegurarse de que sólo una instancia de una clase, y proporcionar un punto de acceso global.

Hay algunos objetos, de hecho, sólo tenemos una, decir el grupo de subprocesos, la caché de diálogo de preferencias de destino de procesamiento y de registro, registro de objeto, el objeto actúa como controladores de periféricos, y así sucesivamente. Usando garantiza el patrón Singleton que tienen sólo se crea una instancia, y proporciona un punto de acceso global, crean objetos sólo cuando sea necesario y objetos globales tan fácil, ni como variable global se ha creado objetos en el comienzo del programa.

realización monomodo no es complicado, usando + método estático getterInstance constructores privado a completa.

public class Singleton {
	private static Singleton uniqueInstance;
	
	private Singleton() {}

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

El siguiente es un ejemplo de un solo modo de realización, el código para simular el proceso de producción de un chocolate de chocolate planta de calderas, la caldera de chocolate requiere sólo una única instancia de la clase.

public class ChocolateBoiler {
	private boolean empty;
	private boolean boiled;
	private static ChocolateBoiler uniqueInstance;
  
	private ChocolateBoiler() {
		empty = true;
		boiled = false;
	}
  
	public static ChocolateBoiler getInstance() {
		if (uniqueInstance == null) {
			System.out.println("Creating unique instance of Chocolate Boiler");
			uniqueInstance = new ChocolateBoiler();
		}
		System.out.println("Returning instance of Chocolate Boiler");
		return uniqueInstance;
	}

	public void fill() {
		if (isEmpty()) {
			empty = false;
			boiled = false;
			// fill the boiler with a milk/chocolate mixture
		}
	}
 
	public void drain() {
		if (!isEmpty() && isBoiled()) {
			// drain the boiled milk and chocolate
			empty = true;
		}
	}
 
	public void boil() {
		if (!isEmpty() && !isBoiled()) {
			// bring the contents to a boil
			boiled = true;
		}
	}
  
	public boolean isEmpty() {
		return empty;
	}
 
	public boolean isBoiled() {
		return boiled;
	}
}
public class ChocolateController {
	public static void main(String args[]) {
		ChocolateBoiler boiler = ChocolateBoiler.getInstance();
		boiler.fill();
		boiler.boil();
		boiler.drain();

		// will return the existing instance
		ChocolateBoiler boiler2 = ChocolateBoiler.getInstance();
	}
}

Singleton y multihilo

En un entorno multiproceso, el método que utiliza el get tomada en varias instancias voluntad, contraria a la intención original del Singleton. solución:

  • Negación palabra clave sincronizada: la eficiencia operativa es baja, el siguiente hilo quiere objetos adquirir, debe esperar en un hilo libera el bloqueo, antes de que puedan continuar.
  • Utilizando el bloque de sincronización: Al igual que con el primer método para el funcionamiento síncrono, ineficiente
  • Una sincronización separada para cierto código importante: sólo el código de clave para instanciar un objeto de sincronización, todavía hay hilo de seguridad
  • Uso DCL comprobar el doble del mecanismo de bloqueo: por ejemplo objetos junto con la palabra clave volátiles en el bloque clave para añadir variables de instancia de clase de la palabra clave volátiles, además de bloqueo sincronizado, puede resolver con éxito el problema de la multi-hilo encuentro "modo vago" .
  • Construido implementado usando clase estática Singleton patrón: DCL se pueden realizar y los mismos efectos.

Ejemplos de la utilización de un DCL sigue:

public class DCL {
	private volatile static DCL uniqueInstance;
 
	private DCL() {}
 
	public static DCL getInstance() {
		if (uniqueInstance == null) {
			synchronized (DCL.class) {
				if (uniqueInstance == null) {
					uniqueInstance = new DCL();
				}
			}
		}
		return uniqueInstance;
	}
}
public class DCLTest {
    public static void main(String[] args) {
        DCL dcl = DCL.getInstance();
    }
}
Publicados 295 artículos originales · ganado elogios 37 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/tianshan2010/article/details/104706054
Recomendado
Clasificación