此代码应足以仅限制一个singleton类的实例。我们如何制作这个对象的两个实例?
class Singleton
{
private:
Singleton()
{}
~Singleton()
{}
static Singleton * ptr;
public:
static Singleton * CreateObject()
{
if (!ptr)
ptr = new Singleton;
return ptr;
}
static void freeObject()
{
if (ptr)
{
delete ptr;
ptr = 0;
}
}
};
Singleton * Singleton::ptr = 0;
答案 0 :(得分:1)
单例模式大约是不,有两个类的实例。
摆脱该约束的最简单方法是删除单例模式:
class Singleton
{
};
Singleton one = new Singleton();
Singleton two = new Singleton();
作为一种副作用,你的代码也变得更加干净,许多人都是Singleton is considered an anti-pattern。
答案 1 :(得分:1)
嗯,另一种尚未暴露的可能性是cuncurrency。
单身模式不够安全。
如果你有两个(或更多)不同的线程同时调用CreateObject()
方法,他们可以很容易地得到对象的不同实例。
您应该添加互斥锁以保护该模式。 或者转移到另一种模式:
static Singleton& instance()
{
static Singleton INSTANCE;
return INSTANCE;
}
答案 2 :(得分:-4)
此代码应足以限制单个类的一个实例。
不是。
我们如何制作这个对象的两个实例?
使用您在问题中提供的单例实现,创建第二个实例相当容易:
public void Del_in()
{
if (Listbox2.SelectedIndex > -1)
{
Listbox2.Items.RemoveAt(Listbox2.SelectedIndex);
using (FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.Write))
{
using (TextWriter tw = new StreamWriter(fs))
foreach (string item in Listbox2.Items)
tw.WriteLine(item);
}
}
}
并享受内存泄漏。
要修复你的单例,你应该尊重rule of five(如果你定义至少一个构造函数,定义它们的全部五个)。或者你可以使用别的东西而不是单身。