繁体   English   中英

具有多实例管理的单例

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM