一個類,只能有1個對象????????(對象在堆空間)
再次創建該對象,直接引用之前的對象
so構造函數不能隨意調用
so構造函數私有
so對象不能構造
如何調用私有化的構造函數:
公開接口調用構造函數
調用構造函數:singleTon instance;
但return instance 之后,產生拷貝構造,就不單例了
so刪除拷貝構造函數:????????singleTon(const singleTon& r) = delete;
不能返回引用,因為構造的是局部變量
? ??
構造函數用 new 調用
調用構造函數之前,判斷一下是否存在唯一對象:
static singleTon* instance = NULL;
if(instance == NULL){
? ? instance = new singleTon();
}
class singleTon{
private:singleTon(){}
public:singleTon(const singleTon& r) = delete; // 刪除拷貝構造函數static singleTon* getInstance(){static singleTon* instance = NULL;if(instance == NULL){sleep(1);instance = new singleTon();}return instance;}
};
int main(int argc,const char** argv){singleTon* s1 = singleTon::getInstance();singleTon* s2 = singleTon::getInstance();cout << s1 << endl;cout << s2 << endl;
}
getIntance 就是構造函數,創建對象用的
有內部的邏輯處理:無論如何創建對象,創建多少個對象,所有對象永遠是同一個?
懶漢單例模式
僅當要用單例,才會創建單例對象(上面就是)
多線程不安全
懶漢:催一下工作一下,催一下工作一下
餓漢單例模式
不管單例對象用不用,反正先申請
多線程安全
餓漢吃放,對于食物不管是否吃得下,不管吃不吃,反正都要擺在面前
懶漢單例和餓漢單例的優缺點
懶漢:
缺點:
- 多線程不安全?
- 邏輯比較復雜
優點:
- 節省空間
- 允許隨時刪除,隨時構造
餓漢:
優點:
- 多線程安全
- 邏輯非常簡單
缺點:
- 消耗空間
- 在程序結束之前,絕對不允許銷毀對象