如何制作这个Singleton类的两个实例?

时间:2017-11-14 09:07:08

标签: c++ oop object singleton

此代码应足以仅限制一个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;

3 个答案:

答案 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(如果你定义至少一个构造函数,定义它们的全部五个)。或者你可以使用别的东西而不是单身。