[英]Servlet: Singleton, Singlethread or Multi Instance Multithread
[英]Singleton with multi instance management
我正在嘗試通過以下方式開發一些東西:
一類:用戶
用戶的幾個實例:“ john”,“ joe”,...
我希望每個名稱僅被實例化一次,所以如果用戶嘗試創建一個已經存在的用戶,則它會返回現有的用戶實例。
使用單例,我只能創建一個實例。
我怎樣才能做到這一點?
您正在尋找的是工廠模式。
讓工廠緩存創建的實例,並在它們存在時返回它們。
您可以通過多種方式實現它:靜態方法,單例模式:枚舉類或經典單例或依存注入。
請注意,如果同時訪問工廠,則該實現還應考慮同步對緩存用戶的對象的訪問。
這是一個枚舉方式和線程安全的示例。
枚舉實現的接口(不是強制性的,但更清晰,更可擴展):
public interface IUserFactory {
User getUser(String user);
}
枚舉工廠:
public enum UserFactory implements IUserFactory {
INSTANCE;
private Map<String, User> map = new ConcurrentHashMap<>();
@Override
public User getUser(String username) {
User user = map.get(username);
if (user != null) {
return user;
}
synchronized (INSTANCE) {
final User user = new User(username);
map.put(username, user);
return user;
}
}
}
創建一個UserFactory
類,然后向其中添加一個方法,例如User getUser(String name)
。
另外,將User
的構造UserFactory
為package-private,以確保只有UserFactory
(屬於同一包)才能實例化新的User
對象。
有關工廠模式的更多信息,請參閱https://en.wikipedia.org/wiki/Factory_method_pattern 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.