• 单例模式


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

  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/ll-10/p/9915903.html
Copyright © 2020-2023  润新知