este es un problema que enfrento muchas veces, cuando estoy diseñando una nueva aplicación Voy a usar un problema de ejemplo para explicar esteGlobal de Estado y simple inyección de dependencias
piensan que estoy escribiendo game.so sencilla quiero para mantener una lista de jugadores. tengo pocas opciones ..
1.Utilice un campo estático de alguna clase
private static ArrayList<Player> players = new ArrayList<Integer>(); public Player getPlayer(int i){ return players.get(i); }
pero esto un estado global
2.O i puede utilizar un producto único
class PlayerList{ private PlayerList instance; private PlayerList(){...} public PlayerList getInstance() { if(instance==null){ ... } return instance; } }
pero esto es malo porque es un producto único
inyección 3.Dependency
class Game { private PlayerList playerList; public Game(PlayerList list) { this.list = list; } public PlayerList getPlayerList() { return playerList; } }
esto parece buena, pero no lo es, si cualquier objeto fuera de juego necesita mirar playerlist (que es el caso habitual) tengo que usar uno de los métodos anteriores para hacer que la clase Juego esté disponible globalmente. así que simplemente agrego otra capa al problema. en realidad no resolvió nada.
¿cuál es la solución óptima? (actualmente uso el enfoque Singleton)
k, pero ¿qué debería hacer cuando quiero utilizar la instancia PlayerList en algún otro lugar? – Manu
Inyectará de nuevo. Un marco como Spring (siempre que programe Java) hará que esto sea mucho más fácil para usted. Cualquier cosa que no sea un servicio o un singleton en sí mismo y por lo tanto no pueda ser inyectado de manera razonable con PlayersList será creado por algún tipo de fábrica que a su vez puede ser inyectada con PlayersList y puede pasarla a los objetos que crea. Sin embargo, si termina inyectando su PlayerList en cada objeto, debería tener algunas dudas sobre su diseño, especialmente encapsulación y ocultamiento de información. –