创建一个类的多个实例,但根据特定属性(多个“单例”)保持它们的唯一性

时间:2014-07-21 08:36:18

标签: java design-patterns singleton

我对Java很陌生并且在努力追随:

我有一个创建对象的类,其中保存了不同的数据(列表)。数据始终分配给一个非常标识符(属性):

class History {
    private String identifier;

    private ArrayList<ObjectsRelatedToIdentifier> objectsRelatedToIdentifier;
}

我现在需要每个标识符(X,Y,Z等)有一个对象,但只有一个。不应该用标识符X实例化两个对象。

此外,我需要能够从其他对象访问这些对象。我该如何“抓住”它们?

这些对象的内部总是相同的,只有标识符不同,当然还有ArrayList中的值。

是否存在某种“多重单一模式”或不同模式的组合?

5 个答案:

答案 0 :(得分:1)

只需遵循单例模式,但不要只对公共对象进行一次引用,而是保留由标识符索引的引用映射。

public class MultiSingle {

    public static MultiSingle getInstance(String id)
    {
        MultiSingle ret = id2obj.get(id);
        if(ret == null)
        {
            ret = new MultiSingle();
            id2obj.put(id,ret);
        }
        return ret;
    }

    private MultiSingle()
    {
        //Your stuff 
    }

    private static Map<String, MultiSingle> id2obj = new HashMap<>();

}

答案 1 :(得分:1)

将您的历史记录对象放入HashMap

HashMap<String key,History h> map = new HashMap<String key,History h>();
map.put("X",new History());

答案 2 :(得分:1)

  

是否有某种&#34;多单身模式&#34;或不同模式的组合?

是的,multiton pattern。哪个(来自维基百科),

  

在软件工程中,多重模式是一种类似于单例的设计模式,它只允许创建一个类的一个实例。多元模式扩展了单例概念,以将命名实例的映射作为键值对进行管理。

Multiton URL Diagram

答案 3 :(得分:0)

你想要的不是单身,它更像是Object Pool

很像数据库连接池。每当您尝试连接到之前连接过的数据库时,您将从池中获得Connection。如果您尝试连接到新数据库,将为您创建一个新的Connection并添加到池中。

在内部,ConnectionPool(或HistoryPool)可以使用哈希映射实现,该哈希映射将连接字符串(或者,在您的情况下,标识符)映射到连接对象(实例) History)。

答案 4 :(得分:0)

使用工厂创建对象并让它跟踪所有值。

首先使构造函数包本地化:

public class YourObject {
    private String uniqueValue;

    YourObject(String id) {
        this.uniqueValue = id;
    }
}

然后让其他人使用YourObjectFactory::create实例化对象:

public final class YourObjectFactory {
    private static Map<String, YourObject> instances = new HashMap<>();

    public static synchronized YourObject create(String id) {
        YourObject oldInstance = instances.get(id);

        if (oldInstance == null) {
            YourObject newInstance = new YourObject(id);
            instances.put(id, newInstance);
            return newInstance;
        } else {
            return oldInstance;
        }
    }
}

喜欢:

YourObject woah = YourObjectFactory.create("Woah!");

在此实现中,如果已为给定的id创建了实例,则将返回对该实例的引用。如果您认为更合适,可以提出异常。