属于面试常考题型
常考原因:设计模式在面向对象程序设计中有着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模式相关的问题。例如:写一个类,且只能创建一个类对象实例
方法一:
网上常用的解法,就是将类的构造函数变成私有,然后创建一个静态成员函数,通过调用静态成员函数来调用私有的类构造函数,可以创建一个或者多个对象实例,都没有问题。例如:
class Singleton2
{
protected:
Singleton2()
{
cout<<"construct a instance"<<endl;
}
public:
static Singleton2* pSingleton; //数据成员
static Singleton2* GetInstance()
{
if ( NULL == pSingleton )
pSingleton = new Singleton2();
else
cout<< "has already a instance" << endl;
return pSingleton;
}
~Singleton2()
{
if ( pSingleton != NULL )
{
cout<< "destructor" << endl;
delete pSingleton;
}
}
};
Singleton2* Singleton2::pSingleton = NULL;
说明:直接调用Singleton2::GetInstance();来创建一个对象实例为了防止从类的外部调用构造函数,产生类的新的实例,我们应该把该类的构造函数声明成protected或者private。由于只能生成一个类的实例,我们可以考虑用静态成员变量来记录实例个数。如果没有构造过,那么就构造一个新的实例。如果构造过,那么就把之前构造的那个实例返回。方法二:
我认为,构造函数可以公有,只要设置一个整型静态成员变量计数器,初始化为0,如果不为0,那么就不能继续生成实例。不知道这样做符合不符合题意
class Singleton
{
public:
Singleton()
{
if (count == 0)
{
count++;
pSingleton = new A;
}
else
cout<< "An instance has already exists" <<endl;
}
~Singleton()
{
if (count != 0 )
{
count--;
delete pSingleton;
}
}
static int count;
private:
A* pSingleton;
};
int Singleton::count = 0;