簡體   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