1

如果 Multiton 的实例数量在编译时是固定的,那么将枚举用于 Multiton模式是一个好主意。我已经看到了Enum Sigleton 模式,所以我只是想知道 Multiton 是否也可以做类似的事情?

4

3 回答 3

3

您链接到的模式的描述没有一组固定的键,所以如果您有一组固定的键,我不确定您是否可以将其称为 Multiton。但是如果我们接受它,那么是的,每个枚举实例都是一个单例。

请记住,枚举是对象:它们可以具有状态和方法。

于 2011-02-26T10:59:12.870 回答
2

在 C# 中,我经常使用一种我称之为“智能枚举”或“重枚举”的模式,在这里我想要一些你可以认为是(a)其值为对象的枚举(如 Java 允许),或(b)a在编译时定义所有可能实例的类(这就是我实现它的方式)。例如,我将音乐模式的概念建模如下:

公开课 MusicalMode
{
    公共只读字符串名称;
    公共只读整数;// 起始参考注释:1=C, 2=D, etc.
    public readonly int[] 间隔;// 1 = 半步,2 = 全步

    公共字符串 ToS​​tring()
    { /* 实现省略 */ }  

    公共静态 MusicalMode FromString (String s)
    { /* 实现省略 */ }

    // 这些是唯一可以存在的实例
    公共静态只读模式爱奥尼亚=新模式(1,“爱奥尼亚”);
    公共静态只读模式 Dorian = new Mode(2, "Dorian");
    public static readonly Mode Phrygian = new Mode(3, "Phrygian");
    公共静态只读模式 Lydian = new Mode(4, "Lydian");
    公共静态只读模式 Mixolydian = new Mode(5, "Mixolydian");
    public static readonly Mode Aeolian = new Mode(6, "Aeolian");
    公共静态只读模式 Locrian = new Mode(7, "Locrian");

    私有模式(int num,字符串名称)
    { /* 实现省略 */ }
}

当我第一次了解 Multiton 模式时,我想“哦,我做到了!”,想到了我的智能/重枚举。但是现在我不确定,基于 JB Nizet 关于密钥集是否固定的评论(就像在我的示例中一样)。

我的 MusicalMode 是 Multiton 的一个例子吗?如果没有,该模式是否有一个公认的名称?

于 2011-02-26T17:42:29.557 回答
0

我认为像GuiceSpring Framework IoC这样的依赖注入工具现在更适合此目的,因为您可以管理范围、状态和其他有趣的东西。

于 2011-02-26T12:06:08.553 回答