• 【设计模式】单例模式 (Singleton)


    一、单例模式 Singleton(2018/12/18 周二)

    要求: 在内存中只能创建一个对象

    1. 该对象不能是栈(全局)对象

    2. 该对象只能放在堆中

    应用场景:

    1. 直接替换任意的全局对象(变量)//因为全局对象越少越好

    2. 配置文件

    3. 词典类

    实现步骤:

    1. 将构造函数私有化

    2. 在类中定一个静态的指针对象(一般设置为私有),并且在类外初始化为空

    3. 定义一个返回值为类指针的静态成员函数,如果2中的指针对象为空,则初始化对象,以后在有对象调用该静态成员函数的时候,不再初始化对象,而是直接返回对象,保证类在内存中只有一个对象

     1 #include <iostream>
     2 using std::cout;
     3 using std::endl;
     4 
     5 //要求: 在内存中只能创建一个对象
     6 //1. 该对象不能是栈(全局)对象
     7 //2. 该对象只能放在堆中
     8 
     9 //应用场景:
    10 //1. 直接替换任意的全局对象(变量)//因为全局对象越少越好
    11 //2. 配置文件
    12 //3. 词典类
    13 
    14 //实现步骤:
    15 //1. 将构造函数私有化
    16 //2. 在类中定一个静态的指针对象(一般设置为私有),并且在类外初始化为空
    17 //3. 定义一个返回值为类指针的静态成员函数,
    18 //      如果2中的指针对象为空,则初始化对象,以后在有对象调用该静态成员函数的时候,不再初始化对象,
    19 //      而是直接返回对象,保证类在内存中只有一个对象
    20 
    21 class Singleton {
    22 public:
    23     static Singleton* getInstance() {  //不是静态的成员函数就没法调用,因为没有对象,需要类名调用
    24         if (_pInstance == 0) {
    25             _pInstance = new Singleton(); //在类内部调用构造函数
    26         }
    27         return _pInstance;
    28     }
    29     static void destory() {
    30         if (_pInstance) {
    31             delete _pInstance;   
    32         }
    33     }
    34     void print() {
    35         printf("Singleton::print() 
    ");
    36     }
    37 private:
    38     Singleton() {
    39         cout << __FUNCTION__ << endl;
    40     }
    41     ~Singleton() {
    42         cout << __FUNCTION__ << endl;
    43     }
    44     static Singleton* _pInstance;
    45 };
    46 
    47 
    48 //Singleton s3; //error
    49 //static Singleton s4; //error
    50 
    51 Singleton * Singleton::_pInstance = 0;
    52 
    53 int main() {
    54     //Singleton s1; //栈对象, error,必须让该语句无法编译通过
    55     //Singleton s2;
    56     //Singleton *p1 = new Singleton();
    57     Singleton* p1 = Singleton::getInstance();
    58     Singleton* p2 = Singleton::getInstance();
    59     printf("p1 = %p 
    ", p1);
    60     printf("p2 = %p 
    ", p2);
    61     p1->print();
    62     p1->destory();
    63     //delete p1; //error, 希望该语句编译无法通过
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    初解DLL基本知识
    读《暗时间》笔记
    红队 Cobalt Strike 安全加固
    《天书夜读 —— 从汇编语言到Windows内核编程》3.3 汇编反C语言练习 参考答案
    记录一次从WordPress后台到拿下主机shell的渗透
    今日记 2019.6.19
    解决Termux无法通过metasploit.sh安装Metasploit的问题
    解决ajax中文乱码问题
    jsp开发知识
    第一个Java web项目:员工管理系统
  • 原文地址:https://www.cnblogs.com/zhangwanying/p/10138093.html
Copyright © 2020-2023  润新知