首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理单例集合?

如何处理单例集合?
EN

Stack Overflow用户
提问于 2010-06-21 17:50:47
回答 2查看 628关注 0票数 0

我们有如下的类层次结构:

代码语言:javascript
复制
public interface IManager {
   object GetObject(int);
}

public class BaseManager : IManager ...

public class XManager : BaseManager {
   ...
   public static XManager Instance;
}

public class YManager : BaseManager {
   ...
   public static YManager Instance;
}

public static class ManagerFacade {
   private static IManager GetManager(type);
   public static object GetObject(type, int) { 
     return GetManager(type).GetObject(int); }
}

您将如何实现GetManager()函数?

是否可以在这些类的静态构造函数中的静态字典中收集这些类型及其实例(或创建委托的实例)?(谢谢你,乔恩,我只记得“.Net 4中有些不同”,但不记得details)

其他方法将使用类属性或BaseManager的后代,或者寻找IManager的实现。

首选的解决方案是什么?

EN

回答 2

Stack Overflow用户

发布于 2010-06-21 18:05:17

我认为最常见的方法是使用像IServiceProvider这样的东西。

票数 1
EN

Stack Overflow用户

发布于 2010-06-21 22:28:27

实现此目的的最佳方法取决于您期望的用法。如果你只有几个经理,并且你希望偶尔增加这个数字,那么我会选择直接的方法:

代码语言:javascript
复制
class ManagerFacade {
  XManager getXManager() {...}
  ....
}

这减少了错误,确保调用者总是得到他们期望的管理器类型。然而,这确实意味着您需要在每次添加一种类型的管理器时更改ManagerFacade,因此它在这些情况下并不合适。

如果您需要相当频繁地添加新的管理器,那么实现

代码语言:javascript
复制
class ManagerFacade {
      IManager getManager(type) {...}
      ....
    }

对getManager()背后的逻辑进行硬编码,并使用枚举或等效类型作为类型。这意味着您需要在添加管理器时重写该方法,但接口不会更改。

如果您的经理经常或动态地更换,那么在幕后保存一个字典,您可以在其中填充适当的经理。使用字符串作为'type',这样你就不必在添加管理器时更改'enum‘类。如果需要,您可以懒惰地初始化管理器。

顺便问一下,您确定这里需要单例吗?仅仅因为你想让ManagerFacade总是返回相同的XManager实例并不意味着XManager必须是一个单例。您可以在ManagerFacade内部创建XManager,或者将管理器创建限制为通过静态方法完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3083601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档