这个问题相当基础。我对我的cygwin做了一个简单而直接的测试:
class Example {
public:
Example(){ cout<<"dude..."<<endl; }
~Example(){ cout<<"see ya"<<endl; }
public:
static Example *GetInstance(){
if(m_instance==NULL){
m_instance = new Example();
cout<<"watch out bro"<<endl;
}
return m_instance;
}
public:
void exp(){cout<<"greetings"<<endl;}
private:
static Example *m_instance;
};
int main(){
Example a;
return 0;
}
显然,输出是:
dude...
greetings
see ya
技术上单身和典型的构造函数在c ++编程中几乎是不同的故事,因为singleton将构造函数设置为私有,而典型的方式则相反。在我最近的实习经历中,我注意到大多数编码人员都以这种方式实现API。
我只是想知道当两种类构造方法并行存在时是否是这种情况。
的更新 的
是构造函数&amp;在一个程序中存在的单例实际上是无意义的,在这个范围内单独的东西会成为无用的代码,如无害的垃圾?
的概要 的 这是一个相当无稽之谈的问题...... 更重要的是,多亏了你们所有人的光彩 构造函数和单例设计模式是“互斥的”,就脆弱性而言,它与全局变量杀死我们的调试时间是一样的...
答案 0 :(得分:2)
通过将Example的构造函数设为public,可以允许类的用户直接创建实例。如果您的设计只需要一个单例实例,则允许用户无意中破坏此要求。如果您将构造函数设为私有,那么调用GetInstance()将是创建Example对象的唯一方法,从而强制要求只允许创建一个实例。
请注意,静态对象的破坏顺序与创建它们的顺序相反。如果对象相互引用,则会导致问题。这是人们维护代码的陷阱,如果你有多个这样的对象,这很快就会变得无法管理。
许多开发人员认为单身人士与全局变量非常相似:
https://sites.google.com/site/steveyegge2/singleton-considered-stupid
答案 1 :(得分:1)
当使用Singleton设计模式时,你总是应该构造构造函数(复制构造函数)和operator = as private,以确保只有给定类的一个实例。否则,Singleton模式就没有多大意义了。
答案 2 :(得分:0)
我认为你错过了单身人士的整个概念。 Singleton意味着只有一个实例,但公共构造函数可以构造很多对象。
答案 3 :(得分:0)
我认为这个例子已被打破。它允许用户创建多个“单身人士”,然后显然他们不是单身人士。
在单例构造函数中必须是私有的。
答案 4 :(得分:0)
将构造函数设为私有不会使类成为Singleton。为此,在调用构造函数之前,必须确保内存中没有其他实例。即使构造函数是私有的,也可以从静态类成员创建任何数量的类实例
答案 5 :(得分:0)
Singleton是一种确保创建的类只有一个实例的技术。通过暴露公共构造函数,您显然为多个实例打开了大门,因此您的类可能不会被称为单例。
然而,它仍然有一个静态的GetInstance()方法,它在某种程度上被期望作为单例接口,并且这使得谁没有编写代码(甚至以后的某个时候甚至是作者)的混淆。