使用单例模式自动生成唯一ID

时间:2014-12-27 13:58:03

标签: oop design-patterns singleton

我提供的一小段代码是在C#中,但问题更多的是关于理论和设计(我认为)而不是代码本身。

在我的应用程序中,用户可以添加项目(让我们说它是愿望清单管理器,用户可以添加他的愿望)。我需要为这些条目自动生成ID。 他们给了我们一个关于如何做到这一点的例子,我们必须使用它(从我在这里阅读的内容来看,GUID是一种很好的方式,如果选择的话,我会选择这样做。我的,但这与此无关。)

给出的例子:

class IDGenerator
{
    private static IDGenerator instance;

    private int nextID;

    private IDGenerator() { nextID = 1; }

    [MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
    public static IDGenerator getGenerator()
    {
        if (instance == null)
        {
            instance = new IDGenerator();
        }
        return instance;
    }

    public int nextId()
    {
        return nextID++;
    }
}

然后,教师有一个IdObject类,Wish继承该类,每次创建一个新的Wish实例时,使用上面的IdGenerator生成一个唯一的ID。很简单。它基本上就像一个全局变量的包装器。

我有一些问题:ID不可重用(不是一个大问题),如果我想要另一个扩展IdObject的类我需要另一个id生成器(通过简单地复制粘贴代码完成或者我可以我知道我到处都有身份证明这一事实。

但是我遇到的最大问题是:如果我保存愿望清单(只是文本文件,序列化,它并不重要),我最终可能会有重复的ID。我可以通过在每次程序启动时强制执行文件读取来解决此问题,检查ID,然后使用超出已使用ID范围的值初始化第一个下一个ID,然后在每次添加项目时强制执行文件保存。或者我可以继续生成ID,直到生成有效ID。但我不想这样做。必须有更好的方法。

所以通过仍然使用单身模式并且不做“魔术技巧”#34;像我上面描述的那些?

2 个答案:

答案 0 :(得分:0)

行。所以问题是如何确保IDGenerator每次恢复时不会一遍又一遍地重复初始序列,对吧?正如你所指出的,一种解决方案是使用足够强大的随机发生器;另一个需要坚持其国家。

所以问题变成:持久或随机化,是否还有其他解决方案?答案是肯定的。

例如,每次恢复生成器时,您都可以将其nextId变量初始化为以秒为单位表示的当前时间戳(我不认为毫秒是必要的。)这样就不会有任何重复。当然,您会在会话之间留出大量未使用的ID,但如果您希望保持生成器代码尽可能简单,则可以将其视为 price 。 p>

答案 1 :(得分:0)

   public sealed class SingletonIdGenerator
{
    private static long _id;
    private SingletonIdGenerator()
    {
    }

    public string Id
    {
        get { return _id++.ToString().Substring(8); }
    }

    public static SingletonIdGenerator Instance { get { return Nested.instance; } }

    private class Nested
    {
        static Nested()
        {
            _id = DateTime.Now.Ticks;
        }
        internal static readonly SingletonIdGenerator instance = new SingletonIdGenerator();
    }
}