2010-10-05 61 views
2

我有后续类(C#为例)设计模式为唯一对象每ID系统

class A 
{ 
    private static Dictionary<int, A> idLookup; 
    .... 
    private A(id) {...} 
    public static A Get(id) 
    { 
     //does some magic 
     if (...) { return idLookup[id]; } 
     else { A a = new A(id); idLookup[a.id] = a; return a; } 
    } 
} 

class B 
{ 
    private static Dictionary<int, B> idLookup; 
    .... 
    private B(id) {...} 
    public static B Get(id) 
    { 
     //does some magic 
     if (...) { return idLookup[id]; } 
     else { B b = new B(id); idLookup[b.id] = b; return b; } 
    } 
} 
... and so on 

是否有一个设计模式(在做继承但有一点凌乱),可以删除所有重复码?

上述功能保证只有1个A/B/...实例存在于一个id中。

+0

这不是很多重复的代码。你可以写一个更专业化的词典来使它更容易,然后它将是一个单线。 – 2010-10-05 20:59:23

+0

所以这是一个单线程程序,我假设? – 2010-10-05 21:05:46

+0

@Kirk羊毛,是的......这些东西在多线程代码中会非常壮观地失败。 – jameszhao00 2010-10-05 21:10:38

回答

3

使用泛型。代码/伪代码:

class UniquePattern<T> 
{ 
    private static Dictionary<int, T> idLookup; 
    .... 
    private T(id) {...} 
    public static T Get(id) 
    { 
     ... 
    } 
} 
+2

对于无参数构造函数有一个'where T:new()'类型约束,但是没有这样的类型参数约束对于具有特定参数的构造函数... ie ie where T:new(int)'是无效的C#。 - 也就是说,仿制药似乎是要走到这里的路。 – stakx 2010-10-05 21:05:08

+0

每次我重新发现“哪里”的语法,每次我惊讶:) @stakx oww我说得太快,然后 – samy 2010-10-05 21:05:24

+0

是的,你是对的。我曾使用new(),但我很惊讶它不支持有参数的构造函数。我已经删除它。 – Aliostad 2010-10-05 21:10:56