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(用户名、用户);
返回用户;
}
}
}