您的位置:首页 > 编程语言 > C语言/C++

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

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

单例模式

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

///ChocolateBoiler.h
#ifndef CHOCOLATEBOILER_H
#define CHOCOLATEBOILER_H

class 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 类型的变量是在程序运行的最开始初始化的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 C++
相关文章推荐