1. 程式人生 > >設計模式——單例模式(C++)

設計模式——單例模式(C++)

clu win 安全 iostream public size turn instance stat

一: 餓漢式單例:

靜態區初始化instance,然後通過getInstance返回。這種方式沒有多線程的問題,是一種以空間換時間的方式,不管程序用不用,都會構造唯一的實例。

#pragma once

#include <Windows.h>
#include "Lock.h"

class Singleton
{
private:
Singleton(); // 構造函數只能在這個類內部自己能用,創建唯一實例
Singleton(const Singleton&); // 防止被復制
Singleton& operator=(const Singleton&); //防止賦值
~Singleton();
static Singleton* m_pInstance;
public:
static Singleton* getInstance()
{
return m_pInstance;
}
};

#include "stdafx.h"
#include "Singleton.h"

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

Singleton::Singleton(const Singleton&)
{}
Singleton& Singleton::operator=(const Singleton&)
{
return *this;
}

Singleton* Singleton::m_pInstance = new Singleton();

// DesignPattern.cpp : 定義控制臺應用程序的入口點。
//

#include "stdafx.h"
#include "Singleton.h"

#include <iostream>

using namespace std;

int main()
{
Singleton *aaa = Singleton::getInstance();
Singleton *bbb = Singleton::getInstance();

cout <<(int*)aaa << endl;
cout <<(int*) bbb << endl;
}

二: 懶漢式單例:

在需要的時候才創建唯一的實例,可能有多線程的問題。下面是采用雙重檢查的方式實現:

2.1 用類的靜態成員的方式

#include <Windows.h>

#include "Lock.h"

class Singleton
{
private:
Singleton(); // 構造函數只能在這個類內部自己能用,創建唯一實例
Singleton(const Singleton&); // 防止被復制
Singleton& operator=(const Singleton&); // 防止賦值
~Singleton();
static Singleton* m_pInstance;
public:
static Singleton* getInstance()
{
if (m_pInstance == NULL)
{
lock(); // 使用其他的方式實現,這裏只是意思一下
if (m_pInstance == NULL)
{
m_pInstance = new Singleton();
}
unlock();
}

return m_pInstance;
}
};

#include "stdafx.h"
#include "Singleton.h"

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

Singleton::Singleton(const Singleton&)
{}
Singleton& Singleton::operator=(const Singleton&)
{
return *this;
}

Singleton* Singleton::m_pInstance =NULL;

// DesignPattern.cpp : 定義控制臺應用程序的入口點。
//

#include "stdafx.h"
#include "Singleton.h"

#include <iostream>

using namespace std;

int main()
{
Singleton *aaa = Singleton::getInstance();
Singleton *bbb = Singleton::getInstance();

cout <<(int*)aaa << endl;
cout <<(int*) bbb << endl;
}

2.1 用局部靜態變量的方式

#pragma once

#include <Windows.h>

#include "Lock.h"

class Singleton
{
private:
Singleton(); // 構造函數只能在這個類內部自己能用,創建唯一實例
Singleton(const Singleton&); // 防止被復制
Singleton& operator=(const Singleton&); // 防止賦值
~Singleton();
public:
static Singleton* getInstance()
{
static Singleton singleton;
// C++0X 以後,局部靜態變量可以保證線程安全的;但是C++0X之前,仍然要加鎖

return &singleton;
}
};

#include "stdafx.h"
#include "Singleton.h"

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

Singleton::Singleton(const Singleton&)
{}
Singleton& Singleton::operator=(const Singleton&)
{
return *this;
}

// DesignPattern.cpp : 定義控制臺應用程序的入口點。
//

#include "stdafx.h"
#include "Singleton.h"

#include <iostream>

using namespace std;

int main()
{
Singleton *aaa = Singleton::getInstance();
Singleton *bbb = Singleton::getInstance();

cout <<(int*)aaa << endl;
cout <<(int*) bbb << endl;
}

設計模式——單例模式(C++)