单例模式

单例模式
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

原文地址:https://www.cnblogs.com/ll-10/p/9915903.html