Java 单例多实例管理
我正在尝试开发一些东西,比如说:Java 单例多实例管理,java,design-patterns,Java,Design Patterns,我正在尝试开发一些东西,比如说: 类别:用户 用户的几个实例:“john”、“joe”… 我希望每个名称只实例化一次,因此如果用户试图创建一个名称已经存在的用户,它将返回现有的用户实例。 对于singleton,我只能举一个例子。 我该怎么做呢?创建一个UserFactory类,然后向其中添加一个方法,比如User getUser(String name) 另外,将User的constructor包设为private,以确保只有UserFactory(属于同一个包)才能实例化新的User对象 有
类别:用户
用户的几个实例:“john”、“joe”…
我希望每个名称只实例化一次,因此如果用户试图创建一个名称已经存在的用户,它将返回现有的用户实例。
对于singleton,我只能举一个例子。
我该怎么做呢?创建一个
UserFactory
类,然后向其中添加一个方法,比如User getUser(String name)
另外,将User
的constructor包设为private,以确保只有UserFactory
(属于同一个包)才能实例化新的User
对象
有关工厂模式的更多信息,请参阅。您要查找的是工厂模式。
让工厂缓存创建的实例并返回它们的存在状态 您可以通过多种方式实现它:静态方法、单例模式:枚举类或经典单例或静态依赖注入。
注意,如果工厂同时访问,则实现也应该考虑同步对缓存用户的对象的访问。p> 下面是一个使用枚举方式和线程安全的示例 由枚举实现的接口(不是强制性的,但更清晰、更可扩展):
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;
}
}
}
枚举工厂:
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;
}
}
}
public enum UserFactory实现IUserFactory{
实例;
私有映射映射=新的ConcurrentHashMap();
@凌驾
公共用户getUser(字符串用户名){
User=map.get(用户名);
如果(用户!=null){
返回用户;
}
已同步(实例){
最终用户=新用户(用户名);
map.put(用户名、用户);
返回用户;
}
}
}