zoukankan      html  css  js  c++  java
  • 【设计模式】单例模式 (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
  • 相关阅读:
    Hdu 5396 Expression (区间Dp)
    Lightoj 1174
    codeforces 570 D. Tree Requests (dfs)
    codeforces 570 E. Pig and Palindromes (DP)
    Hdu 5385 The path
    Hdu 5384 Danganronpa (AC自动机模板)
    Hdu 5372 Segment Game (树状数组)
    Hdu 5379 Mahjong tree (dfs + 组合数)
    Hdu 5371 Hotaru's problem (manacher+枚举)
    Face The Right Way---hdu3276(开关问题)
  • 原文地址:https://www.cnblogs.com/zhangwanying/p/10138093.html
Copyright © 2011-2022 走看看