đây là một vấn đề tôi phải đối mặt với rất nhiều lần khi tôi đang thiết kế một ứng dụng mới tôi sẽ sử dụng một bài toán mẫu để giải thích nàytoàn cầu Nhà nước và Singletons Dependency Injection
nghĩ rằng tôi đang viết game.so đơn giản tôi muốn để giữ danh sách người chơi. tôi có vài lựa chọn ..
1.Use một lĩnh vực tĩnh trong một số lớp
private static ArrayList<Player> players = new ArrayList<Integer>(); public Player getPlayer(int i){ return players.get(i); }
nhưng điều này tình trạng toàn cầu
2.or tôi có thể sử dụng một singleton
class PlayerList{ private PlayerList instance; private PlayerList(){...} public PlayerList getInstance() { if(instance==null){ ... } return instance; } }
nhưng điều này là xấu bởi vì nó là một singleton
tiêm 3.Dependency
class Game { private PlayerList playerList; public Game(PlayerList list) { this.list = list; } public PlayerList getPlayerList() { return playerList; } }
này có vẻ tốt, nhưng nó không phải là, nếu có đối tượng bên ngoài trò chơi cần phải nhìn vào PlayerList (đó là trường hợp thông thường) tôi phải sử dụng một trong các phương pháp trên để làm cho lớp Trò chơi có sẵn trên toàn cầu. vì vậy tôi chỉ cần thêm một lớp khác vào sự cố. đã không thực sự giải quyết bất cứ điều gì.
giải pháp tối ưu là gì? (hiện tại tôi đang sử dụng phương thức Singleton)
k, nhưng phải làm gì khi tôi muốn sử dụng phiên bản PlayerList ở một số nơi khác? – Manu
Bạn sẽ lại tiêm nó. Một khung công tác như Spring (miễn là bạn lập trình Java) sẽ làm cho việc này dễ dàng hơn nhiều cho bạn. Bất kỳ thứ gì không phải là dịch vụ hay singleton và do đó không thể được tiêm hợp lý với PlayersList sẽ được tạo ra bởi một số loại nhà máy mà lần lượt có thể được tiêm với PlayerList và có thể truyền nó cùng với các đối tượng mà nó tạo ra. Tuy nhiên, nếu bạn kết thúc việc đưa PlayerList của bạn vào mỗi đối tượng, bạn nên có một số suy nghĩ thứ hai về thiết kế của bạn đặc biệt là đóng gói và ẩn thông tin. –