《Head First 设计模式》例子的C++实现(5 单例模式)

来源:互联网 发布:人工智能利与弊演讲ppt 编辑:程序博客网 时间:2024/05/25 08:12

最近在学习设计模式,用的是 《Head First 设计模式》这本书。感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式。唯一有点不方便的地方是这本书的例子全都是用的 Java 来实现的。而我主要是用 C++。所以就动手将书上的代码用 C++ 来实现了一遍。

单例模式

单例模式相对比较简答,只要将类的构造函数搞成 private 就行了。

///ChocolateBoiler.h#ifndef CHOCOLATEBOILER_H#define CHOCOLATEBOILER_Hclass ChocolateBoiler{public:    void fill();    void drain();    void boil();    bool isEmpty() {return m_empty;}    bool isBoiled() {return m_boiled;}    static ChocolateBoiler * getInstance();private:    ChocolateBoiler();    bool m_empty;    bool m_boiled;    static ChocolateBoiler * m_instance;};#endif // CHOCOLATEBOILER_H
///ChocolateBoiler.cpp#include "chocolateboiler.h"#include <iostream>using std::cout;using std::endl;ChocolateBoiler::ChocolateBoiler(){    m_empty = true;    m_boiled = false;}void ChocolateBoiler::fill(){    if(isEmpty())    {        m_empty = false;        m_boiled = false;        cout << "ChocolateBoiler is filled" << endl;        // other things    }}void ChocolateBoiler::drain(){    if(!isEmpty() && isBoiled())    {        //        m_empty = true;        cout << "ChocolateBoiler is drained" << endl;    }}void ChocolateBoiler::boil(){    if(!isEmpty() && !isBoiled())    {        m_boiled = true;        cout << "ChocolateBoiler is boiled" << endl;    }}ChocolateBoiler * ChocolateBoiler::m_instance = nullptr;ChocolateBoiler * ChocolateBoiler::getInstance(){    if(!m_instance) // 如果用在多线程环境下,这里需要加锁    {        m_instance = new ChocolateBoiler;    }    return m_instance;}

如果希望在程序一运行时就建立对象,可以这样写:

ChocolateBoiler * ChocolateBoiler::m_instance = new ChocolateBoiler;ChocolateBoiler * ChocolateBoiler::getInstance(){    return m_instance;}

这里用到的知识点就是 static 类型的变量是在程序运行的最开始初始化的。

1 0
原创粉丝点击