設計模式——單例模式(C++)
一: 餓漢式單例:
靜態區初始化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++)