这无疑是一个相当宽松的问题.我目前对单身人士的理解是,他们是一个你设置的类,只有一个实例被创建.
这对我来说听起来很像静态类.主要区别在于,对于静态类,您不能/不能实例化它,您只需使用它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)
请注意,我独立询问这种语言,更多关于这个概念.所以我并不担心实际上如何编写这样一个类,但更多的是为什么你不愿意和你需要考虑什么.
我最近几天一直在阅读关于Singleton模式的文章.一般认为,需要它的场景很少(如果不是很少见),可能是因为它有一些问题,例如
我开始了解这些问题背后的想法,但不完全确定这些问题.就像垃圾收集问题一样,在单例实现中使用静态(这是模式固有的),是关注点吗?因为这意味着静态实例将持续到应用程序.它是否会降低内存管理(它只是意味着分配给单例模式的内存不会被释放)?
当然,在多线程设置中,让所有线程都争用单例实例将是一个瓶颈.但是这种模式的使用如何导致同步问题(当然我们可以使用互斥或类似的东西来同步访问).
从(单元?)测试的角度来看,由于单身人士使用静态方法(很难被模拟或存根),他们可能会导致问题.对此不确定.有人可以详细说明这个测试问题吗?
谢谢.
我已经使用Visual Studio Team Edition测试框架准备了一些自动测试.我希望其中一个测试按照在程序中完成的正常方式连接到数据库:
string r_providerName = ConfigurationManager.ConnectionStrings["main_db"].ProviderName;
Run Code Online (Sandbox Code Playgroud)
但是我在这一行中收到了一个例外.我想这是因为ConfigurationManager是一个单例.你怎么能解决单元测试中的单例问题?
谢谢你的回复.所有这些都非常有启发性.
我对单身人士模式有疑问.
我在单例类中看到了两个关于静态成员的案例.
首先它是一个像这样的对象
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) 我很清楚你想使用Singleton来提供对某些州或服务的全局访问点.在这个问题中不需要列举Singleton模式的好处.
我感兴趣的是Singleton一开始看起来不错的情况,但可能会回来咬你.一次又一次,我在书籍和海报上看到作者说,单身人士模式往往是一个非常糟糕的主意.
四人帮表示你想在以下情况下使用Singleton:
这些要点虽然值得注意,但并不是我所寻求的实际问题.
有没有人有一套规则或警告你用来评估你是否真的,确定你想要使用Singleton?
当人们使用Monostate模式而不是singleton来维护全局对象时,会出现什么情况?
编辑:我知道Singleton和Monostate模式是什么.在很多场景中也实现了Singleton.只想知道需要实现MonoState模式的场景(案例).
例如.我需要在我的Windows窗体应用程序中维护每个屏幕的列列表.在这种情况下,我可以使用Singleton Dictionary.但是,我在静态全局var中存储了一个List,我想提供索引器(因为我需要动态地将新条目添加到列表中,如果key不存在),我可以将ScreenDetails.ScreenName指定为键并获取ScreenDetails .ColumnsTable.由于索引器无法在静态类上操作,因此我将模式更改为Monostate.
所以我想知道哪些其他场景可能迫使用户使用Monostate而不是Singletons.
几天前,我遇到了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)
希望能节省一些时间.
我试图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) 将Singleton对象重构为集群环境的最佳策略是什么?
我们使用Singleton从Database中缓存一些自定义信息.它主要是只读的,但在某些特定事件发生时会刷新.
现在我们的应用程序需要部署在集群环境中.根据定义,每个JVM都有自己的Singleton实例.因此,当在单个节点上发生刷新事件并刷新其缓存时,缓存可能在JVM之间不同步.
保持缓存同步的最佳方法是什么?
谢谢.
编辑:缓存主要用于向UI提供自动完成列表(性能原因),我们使用Websphere.所以任何与Websphere相关的技巧都欢迎.
我一直在阅读很多关于单身人士的信息,他们应该和不应该使用它们,以及如何安全地实施它们.我正在用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)
当我看第二个例子时,这是一个单例,它是非常直观的,因为该类拥有对其自身的一个实例的引用,并且只返回该实例.但是,在第一个示例中,我不明白这是如何防止存在对象的两个实例的.所以我的问题是:
谢谢你的帮助,