单例模式
1)一个类只允许存在唯一的实例(由类的提供者来保证),并提供该实例的访问方法。
2)实现单例模式思路
---》 禁止在类的外部创建对象:私有化构造函数 原因:用来避免创建该类的实例对象
---》 类的内部维护唯一的对象:静态成员对象 原因:类不能产生实例,所以是不完整的类型,不能创建不完整类型的变量,除非该变量是static的或引用、指针。
---》 提供单例对象的访问方法:静态成员函数 原因:静态成员函数的调用只需className::methodName即可调用,而因为单例模式无法创建出对象,所以无法通过对象来调用普通方法
3)创建方式
---》 饿汉式:单例对象无论是否被使用,程序启动即创建。 【用对象维护】 静态的对象在main函数前就被创建了
1 #include<iostream> 2 using namespace std; 3 4 class Singleton{ 5 public: 6 // 3) 提供单例对象的访问方法 7 static Singleton& getInstance(){ 8 return s_instance; 9 } 10 11 void print(){ 12 cout<<m_data<<endl; 13 } 14 15 private: 16 int m_data; 17 // 1) 私有化构造函数 18 Singleton(int data=0):m_data(data){ 19 cout<<"單例對象被創建了"<<endl; 20 } 21 22 Singleton(const Singleton&); 23 // 2)类内部维护唯一的静态成员对象 24 static Singleton s_instance; 25 }; 26 Singleton Singleton::s_instance(123); 27 28 int main(void) 29 { 30 cout<<"开始运行"<<endl; 31 Singleton &s1 = Singleton::getInstance(); 32 Singleton &s2 = Singleton::getInstance(); 33 Singleton &s3 = Singleton::getInstance(); 34 35 s1.print(); 36 s2.print(); 37 s3.print(); 38 39 cout<<"&s1="<<&s1<<",&s2="<<&s2<<",&s3="<<&s3<<endl; 40 return 0; 41 }
运行结果:
單例對象被創建了 //这句话在“开始运行”之前,说明静态的对象在main函数前就被创建了
开始运行
123
123
123
&s1=0x601194,&s2=0x601194,&s3=0x601194
---》 懒汉式:单例对象用时再创建,不用即销毁。 【用对象的指针维护】 用的时候才创建
1 #include<iostream> 2 using namespace std; 3 4 class Singleton{ 5 public: 6 // 3)提供单例对象的访问方法 7 static Singleton& getInstance(){ 8 if(s_instance==NULL) 9 s_instance = new Singleton(123); 10 ++s_count; 11 return *s_instance; 12 } 13 14 void release(){ 15 if(--s_count==0){ 16 delete s_instance; 17 s_instance = NULL; 18 } 19 } 20 21 void print()const{ 22 cout << m_data << endl; 23 } 24 25 private: 26 int m_data; 27 // 1)私有化构造函数 28 Singleton(int data):m_data(data){ 29 cout<<"单例对象被创建"<<endl; 30 31 } 32 ~Singleton(void){ 33 cout << "单例对象被销毁了!" << endl; 34 } 35 // 2)类内部维护唯一的静态成员对象的指针 36 static Singleton *s_instance; 37 // 维护一个引用计数,因为这个引用计数不属于任何一个对象,是所有对象共有的,所以为static 38 static int s_count; 39 }; 40 41 Singleton* Singleton::s_instance = NULL; 42 int Singleton::s_count = 0; 43 44 int main(void) 45 { 46 cout<<"开始运行"<<endl; 47 Singleton &s1 = Singleton::getInstance(); 48 Singleton &s2 = Singleton::getInstance(); 49 Singleton &s3 = Singleton::getInstance(); 50 51 s1.print(); 52 s1.release(); 53 s2.print(); 54 s2.release(); 55 s3.print(); 56 s3.release(); 57 58 cout<<"&s1="<<&s1<<",&s2="<<&s2<<",&s3="<<&s3<<endl; 59 return 0; 60 61 }
运行结果:
开始运行
单例对象被创建 // 这句话在“开始运行”之后,说明该对象在使用到的时候才被创建
123
123
123
单例对象被销毁了!
&s1=0x14ee030,&s2=0x14ee030,&s3=0x14ee030