首页 > 编程 > C++ > 正文

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

2019-11-08 02:29:26
字体:
来源:转载
供稿:网友

最近在学习设计模式,用的是 《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 类型的变量是在程序运行的最开始初始化的。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选