Singleton具有多实例管理功能

时间:2018-04-22 13:27:12

标签: java design-patterns

我试图通过让我们说出来开发一些东西:
一类:用户
User的几个实例:" john"," joe",...
我希望每个名称只实例一次,因此如果用户尝试创建一个已存在的用户名,它将返回现有的用户实例。
单身人士,我只能做一个例子 我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

您所寻找的是工厂模式 让工厂缓存创建的实例并在它们存在时返回它们。

您可以通过多种方式实现它:静态方法,单例模式:枚举类或经典单例或静态依赖注入。
请注意,如果同时访问工厂,则实现还应考虑同步对缓存用户的对象的访问。

以下是枚举方式和线程安全的示例。

由枚举实现的接口(非强制性但更清晰,更具扩展性):

public interface IUserFactory {

    User getUser(String user);

}

Enum工厂:

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;
        }

    }

}

答案 1 :(得分:1)

创建一个UserFactory类,然后向其中添加一个方法,例如User getUser(String name)

另外,使User的contructor包为private,以确保只有UserFactory(属于同一个包)才能实例化新的User个对象。

有关工厂模式的更多信息,请参阅https://en.wikipedia.org/wiki/Factory_method_pattern