[英]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.