zoukankan      html  css  js  c++  java
  • 单例模式

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

  • 相关阅读:
    FillForm网页表单填写插件(用于火狐浏览器,自动填表,自动表单,填写表单)
    Firefox下完整读写本地文件的方法
    failure notice
    百度奖品兑换监视程序
    javascript数组及其操作(zz)
    JMETER使用
    ubuntu安装mysql
    windows live writer写csdn博客,very good~
    用SSH在linux下安装JDK和Tomcat
    java模拟HTTP请求(集合了网上搜来的各种)
  • 原文地址:https://www.cnblogs.com/ll-10/p/9915903.html
Copyright © 2011-2022 走看看