參加了多場筆試,在筆試題目中偶爾會問什麼單件模式。在網上搜了之後了解到這是設計模式中的一種設計方法。單件模式可用於消除全局這樣的需求。
Q.什麼是單件模式?
A.單件模式是一種用於確保整個應用程序中只有一個實例,且這個實例所占資源在整個應用程序中是共享時的程序設計方法。
Q在面向對象中如何設計出只有一個實例的對象呢?
A.每個對象的產生都要調用構造函數,對構造函數進行限制有可能能達到要求。因此,把構造函數設計為私有或保護類型。
Q.私有的構造函數如何構造一個對象呢?
A.聲明成一個類的靜態變量,變量聲明時可以調用私有的構造函數或者在有權限調用私有函數的函數內部構造該對象(對象內的函數有權限,友元有權限)
明白了這些,看看如何通過全局變量的方法構建一個滿足單件模式的類吧。
[cpp]
class singleton
{
static singleton s;
int i;
singleton(int x): i(x){};//構造函數全屏蔽掉
singleton(const singleton &);
singleton & operator=(singleton &);
public:
static singleton& instance() //返回對象
{
return s;
}
int getValue()
{
return i;
}
void setValue(int x)
{
i = x;
}
};
singleton singleton::s(44); //這裡可以對對象進行初始化
測試
[cpp]
int main()
{
singleton & s=singleton::instance();//獲得對象
cout << s.getValue()<<endl;
singleton & s1=singleton::instance();//獲得對象
s1.setValue(20);
cout << s.getValue()<<endl;
return 0;
}
這樣的設計是不是很漂亮?還有更漂亮的,咱們試著去掉那句單獨的初始化。
我們知道,局部靜態變量會被初始化一次,並且僅當函數被調用時才會生成該變量。該變量自從被生成就會一直存在著。這樣可以滿足需求。
設計如下
[cpp]
class singleton
{
int i;
singleton(int x): i(x){};
singleton(const singleton &);
singleton & operator=(singleton &);
public:
static singleton& instance()
{
static singleton s(44);
return s;
}
int getValue()
{
return i;
}
void setValue(int x)
{
i = x;
}
};
測試
[cpp]
int main()
{
singleton & s=singleton::instance();//獲得對象
cout << s.getValue()<<endl;
singleton & s1=singleton::instance();//獲得對象
s1.setValue(20);
cout << s.getValue()<<endl;
return 0;
}
上面的方法並沒有限制只創建一個對象。上面的技術支持創建有限個對象的對象池。考慮構造靜態對象數組。解決了吧。