Tengo una TrafficMonitor
clase, dentro de la clase, no tengo un método estático fábrica para devolver una instancia de esta clase:
public class TrafficMonitor {
private String busNumber;
//private constructor
private TrafficMonitor(String busNumber) {
this.busNumber = busNumber;
}
// static factory method to return a instance of this class
public static TrafficMonitor forBus(String busNumber) {
// how to make sure one instance per busNumber???
return new TrafficMonitor(busNumber);
}
}
No quiero que la TrafficMonitor
de ser un producto único en general. Pero dentro del método de fábrica estática forBus(String busNumber)
, me gustaría asegurarse de que la misma instancia de TrafficMonitor
es cambio de la misma busNumber
. Eso es "Singleton" per busNumber
. ¿Cómo lograrlo?
Por ejemplo siguiente código debe utilizar la misma instancia de TrafficMonitor
:
// monitor1 and monitor2 are referring to the same instance
TrafficMonitor monitor1 = TrafficMonitor.forBus("123");
TrafficMonitor monitor2 = TrafficMonitor.forBus("123");
Después de código debe utilizar diferentes casos de TrafficMonitor
:
// monitor1 and monitor2 are two different instances
TrafficMonitor monitor1 = TrafficMonitor.forBus("123");
TrafficMonitor monitor2 = TrafficMonitor.forBus("456");
Y yo quiero tener el método de fábrica estática sea seguro para hilos también. Eso, si dos subprocesos llaman para el mismo número de autobuses, dos hilos deben utilizar la misma instancia también.
Añadir instancias de un mapa estático. Utilizar computeIfAbsent
para devolver la instancia existente si la clave ya existe o crear uno nuevo si no lo hace.
A ConcurrentMap
garantiza la seguridad hilo.
private static ConcurrentMap<String, TrafficMonitor> instances = new ConcurrentHashMap<>();
public static TrafficMonitor forBus(String busNumber) {
return instances.computeIfAbsent(busNumber, TrafficMonitor::new);
}