标签: singleton

编程中单例的目的

这无疑是一个相当宽松的问题.我目前对单身人士的理解是,他们是一个你设置的类,只有一个实例被创建.

这对我来说听起来很像静态类.主要区别在于,对于静态类,您不能/不能实例化它,您只需使用它Math.pi().使用单例类,你仍然需要做类似的事情

singleton firstSingleton = new singleton();
firstSingleton.set_name("foo");

singleton secondSingleton = new singleton();
Run Code Online (Sandbox Code Playgroud)

如果我错了,请纠正我,但firstSingleton == secondSingleton现在,是吗?

secondSingleston.set_name("bar");
firstSingleton.report_name(); // will output "bar" won't it?
Run Code Online (Sandbox Code Playgroud)

请注意,我独立询问这种语言,更多关于这个概念.所以我并不担心实际上如何编写这样一个类,但更多的是为什么你不愿意和你需要考虑什么.

language-agnostic theory singleton

50
推荐指数
2
解决办法
2万
查看次数

Singleton模式的问题

我最近几天一直在阅读关于Singleton模式的文章.一般认为,需要它的场景很少(如果不是很少见),可能是因为它有一些问题,例如

  • 在垃圾收集环境中,它可能是内存管理方面的问题.
  • 在多线程环境中,它可能导致瓶颈并引入同步问题.
  • 来自测试的头痛.

我开始了解这些问题背后的想法,但不完全确定这些问题.就像垃圾收集问题一样,在单例实现中使用静态(这是模式固有的),是关注点吗?因为这意味着静态实例将持续到应用程序.它是否会降低内存管理(它只是意味着分配给单例模式的内存不会被释放)?

当然,在多线程设置中,让所有线程都争用单例实例将是一个瓶颈.但是这种模式的使用如何导致同步问题(当然我们可以使用互斥或​​类似的东西来同步访问).

从(单元?)测试的角度来看,由于单身人士使用静态方法(很难被模拟或存根),他们可能会导致问题.对此不确定.有人可以详细说明这个测试问题吗?

谢谢.

c++ singleton design-patterns

46
推荐指数
4
解决办法
1万
查看次数

用单身人士进行单元测试

我已经使用Visual Studio Team Edition测试框架准备了一些自动测试.我希望其中一个测试按照在程序中完成的正常方式连接到数据库:

string r_providerName = ConfigurationManager.ConnectionStrings["main_db"].ProviderName;
Run Code Online (Sandbox Code Playgroud)

但是我在这一行中收到了一个例外.我想这是因为ConfigurationManager是一个单例.你怎么能解决单元测试中的单例问题?


谢谢你的回复.所有这些都非常有启发性.

singleton unit-testing

46
推荐指数
4
解决办法
5万
查看次数

C++中的单例模式

我对单身人士模式有疑问.

我在单例类中看到了两个关于静态成员的案例.

首先它是一个像这样的对象

class CMySingleton
{
public:
  static CMySingleton& Instance()
  {
    static CMySingleton singleton;
    return singleton;
  }

// Other non-static member functions
private:
  CMySingleton() {}                                  // Private constructor
  ~CMySingleton() {}
  CMySingleton(const CMySingleton&);                 // Prevent copy-construction
  CMySingleton& operator=(const CMySingleton&);      // Prevent assignment
};
Run Code Online (Sandbox Code Playgroud)

一个是指针,就像这样

class GlobalClass
{
    int m_value;
    static GlobalClass *s_instance;
    GlobalClass(int v = 0)
    {
        m_value = v;
    }
  public:
    int get_value()
    {
        return m_value;
    }
    void set_value(int v)
    {
        m_value = v;
    }
    static GlobalClass *instance()
    {
        if …
Run Code Online (Sandbox Code Playgroud)

c++ singleton

46
推荐指数
1
解决办法
5万
查看次数

什么时候不应该使用Singleton模式?(除了明显的)

我很清楚你想使用Singleton来提供对某些州或服务的全局访问点.在这个问题中不需要列举Singleton模式的好处.

我感兴趣的是Singleton一开始看起来不错的情况,但可能会回来咬你.一次又一次,我在书籍和海报上看到作者说,单身人士模式往往是一个非常糟糕的主意.

四人帮表示你想在以下情况下使用Singleton:

  • 必须只有一个类的实例,并且客户端必须可以从一个众所周知的访问点访问它.
  • 当唯一实例应该通过子类化可扩展时,客户端应该能够使用扩展实例而无需修改其代码.

这些要点虽然值得注意,但并不是我所寻求的实际问题.

有没有人有一套规则或警告你用来评估你是否真的,确定你想要使用Singleton?

language-agnostic singleton design-patterns

46
推荐指数
4
解决办法
2万
查看次数

Monostate vs. Singleton

当人们使用Monostate模式而不是singleton来维护全局对象时,会出现什么情况?

编辑:我知道Singleton和Monostate模式是什么.在很多场景中也实现了Singleton.只想知道需要实现MonoState模式的场景(案例).

例如.我需要在我的Windows窗体应用程序中维护每个屏幕的列列表.在这种情况下,我可以使用Singleton Dictionary.但是,我在静态全局var中存储了一个List,我想提供索引器(因为我需要动态地将新条目添加到列表中,如果key不存在),我可以将ScreenDetails.ScreenName指定为键并获取ScreenDetails .ColumnsTable.由于索引器无法在静态类上操作,因此我将模式更改为Monostate.

所以我想知道哪些其他场景可能迫使用户使用Monostate而不是Singletons.

language-agnostic singleton design-patterns

45
推荐指数
4
解决办法
2万
查看次数

Unity中的Singleton Per Call上下文(Web请求)

几天前,我遇到了ASP.Net线程的这个问题.我希望每个Web请求都有一个单例对象.我的工作单位实际上需要这个.我想为每个Web请求实例化一个工作单元,以便身份映射在整个请求中有效.这样我就可以使用IoC透明地将我自己的IUnitOfWork注入到我的存储库类中,并且我可以使用相同的实例来查询然后更新我的实体.

由于我使用Unity,我错误地使用了PerThreadLifeTimeManager.我很快意识到ASP.Net线程模型不支持我想要实现的目标.基本上它使用theadpool并回收线程,这意味着每个线程我得到一个UnitOfWork!但是,我想要的是每个Web请求的一个工作单元.

一些谷歌搜索给了我这个伟大的帖子.这正是我想要的; 除了非常容易实现的统一部分.

这是我对PerCallContextLifeTimeManager实现统一的实现:

public class PerCallContextLifeTimeManager : LifetimeManager
{
    private const string Key = "SingletonPerCallContext";

    public override object GetValue()
    {
        return CallContext.GetData(Key);
    }

    public override void SetValue(object newValue)
    {
        CallContext.SetData(Key, newValue);
    }

    public override void RemoveValue()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,我使用它来使用与此类似的代码注册我的工作单元:

unityContainer
            .RegisterType<IUnitOfWork, MyDataContext>(
            new PerCallContextLifeTimeManager(),
            new InjectionConstructor());
Run Code Online (Sandbox Code Playgroud)

希望能节省一些时间.

asp.net singleton unity-container unit-of-work lifetime

45
推荐指数
2
解决办法
2万
查看次数

WPF:关闭后无法重用窗口

我试图Window在需要的时候保留一个实例ShowDialog.这在winforms中找到了,但是在WPF中我接受了这个例外:

System.InvalidOperationException:无法在Window关闭后设置Visibility或调用Show,ShowDialog或WindowInteropHelper.EnsureHandle.

有没有办法在WPF中做这样的事情?

MyWindow.Instance.ShowDialog();

public class MyWindow : Window
{
    private static MyWindow _instance;

    public static MyWindow Instance
    {
        if( _instance == null )
        {
            _instance = new Window();
        }
        return _instance();
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# wpf singleton window

45
推荐指数
3
解决办法
6万
查看次数

群集环境中的单例

将Singleton对象重构为集群环境的最佳策略是什么?

我们使用Singleton从Database中缓存一些自定义信息.它主要是只读的,但在某些特定事件发生时会刷新.

现在我们的应用程序需要部署在集群环境中.根据定义,每个JVM都有自己的Singleton实例.因此,当在单个节点上发生刷新事件并刷新其缓存时,缓存可能在JVM之间不同步.

保持缓存同步的最佳方法是什么?

谢谢.

编辑:缓存主要用于向UI提供自动完成列表(性能原因),我们使用Websphere.所以任何与Websphere相关的技巧都欢迎.

java websphere singleton cluster-computing

43
推荐指数
3
解决办法
4万
查看次数

迈耶斯如何实施单身人士实际上是一个单身人士

我一直在阅读很多关于单身人士的信息,他们应该和不应该使用它们,以及如何安全地实施它们.我正在用C++ 11编写,并且遇到了Meyer对单例的懒惰初始化实现,如本问题所示.

这个实现是:

static Singleton& instance()
{
     static Singleton s;
     return s;
}
Run Code Online (Sandbox Code Playgroud)

我理解这对于SO的其他问题是如何线程安全的,但我不明白的是这实际上是一个单例模式.我用其他语言实现了单例,这些总是像维基百科这样的例子:

public class SingletonDemo {
        private static volatile SingletonDemo instance = null;

        private SingletonDemo() {       }

        public static SingletonDemo getInstance() {
                if (instance == null) {
                        synchronized (SingletonDemo .class){
                                if (instance == null) {
                                        instance = new SingletonDemo ();
                                }
                      }
                }
                return instance;
        }
}
Run Code Online (Sandbox Code Playgroud)

当我看第二个例子时,这是一个单例,它是非常直观的,因为该类拥有对其自身的一个实例的引用,并且只返回该实例.但是,在第一个示例中,我不明白这是如何防止存在对象的两个实例的.所以我的问题是:

  1. 第一个实现如何强制执行单例模式?我假设它与static关键字有关,但我希望有人能够深入地向我解释发生在幕后的事情.
  2. 在这两种实现方式之间,是否优于另一种?优缺点都有什么?

谢谢你的帮助,

c++ singleton design-patterns c++11

43
推荐指数
2
解决办法
3万
查看次数