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

來源:互聯網
上載者:User

標籤:時間   bbb   class   成員   控制台   main   pat   static   tor   

一: 餓漢式單例:

  靜態區初始化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++)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.