日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

设计模式 之美 -- 单例模式

發(fā)布時(shí)間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 之美 -- 单例模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么要使用單例?

一個(gè)類只允許創(chuàng)建一個(gè)對(duì)象或者實(shí)例。

背景簡(jiǎn)介:使用多線程并發(fā)訪問同一個(gè)類,為了保證類的線程安全,可以有兩種方法:

  1. 將該類定義為單例模式,即該類僅允許創(chuàng)建一個(gè)實(shí)例
  2. 為該類的成員函數(shù)添加類級(jí)別的鎖

舉例:

一個(gè)向指定文件寫入日志的類,為了保證該類并發(fā)調(diào)用時(shí)寫入文件的日志不會(huì)覆蓋,需執(zhí)行以上操作。

單例模式的幾種經(jīng)典的實(shí)現(xiàn)方式:

  • 餓漢式

    在類的加載期間,將靜態(tài)實(shí)例初始化好,所以實(shí)例的創(chuàng)建是線程安全的。但是這樣的方式不支持延遲加載,且每加載一個(gè)實(shí)例都會(huì)重新初始化一次,開銷較大。

  • 懶漢式

    懶漢模式相對(duì)于餓漢模式的優(yōu)點(diǎn)是支持延遲加載(C++ 種的動(dòng)態(tài)綁定),只有實(shí)例化的時(shí)候才知道該對(duì)象的實(shí)例。但是會(huì)導(dǎo)致出現(xiàn)頻發(fā)加鎖,釋放鎖造成效率底下 的問題。

  • 雙重檢測(cè)

    雙重檢測(cè)既支持延遲加載,又支持高并發(fā)的單例實(shí)現(xiàn)方式。

  • 靜態(tài)內(nèi)部類

    JAVA支持的靜態(tài)內(nèi)部類實(shí)現(xiàn)單例。這種實(shí)現(xiàn)方式既支持延遲加載,也支持高并發(fā)實(shí)例,實(shí)現(xiàn)起來也比雙重檢測(cè)簡(jiǎn)單。

  • 枚舉

    最簡(jiǎn)單的實(shí)現(xiàn)方式,基于枚舉實(shí)現(xiàn)的單例。通過枚舉類型本身的特性,保證了實(shí)例創(chuàng)建的線程安全性和實(shí)例的唯一性。

C語言單例模式的實(shí)現(xiàn):

餓漢模式

csingleton.h

#ifndef CSINGLETON_H
#define CSINGLETON_H
#include <stdlib.h>typedef struct {void* (*ctor)(void *_self);void* (*dtor)(void *_self);void* (*createInstance)(void *self);void *instance;
} _CSingleton;extern const void *CSingleton;
void *GetInstance(void);#endif

csingleton.c

#include "csingleton.h"
#include <stdlib.h>static void *csingletonCtor(void *_self) {_CSingleton *self = _self;self->instance = _self;return self;
}static void *csingletonDtor(void *_self) {_CSingleton *self = _self;self->instance = NULL;return self;
}static void *csingletonCreateInstance(void *_self) {_CSingleton *self = _self;self->instance = _self;return self;
}static _CSingleton _csingleton = {csingletonCtor, csingletonDtor, csingletonCreateInstance, NULL
};
const void *CSingleton = &_csingleton;void *GetInstance(void) { //當(dāng)調(diào)用該函數(shù)加載類的時(shí)候進(jìn)行初始化if (NULL == ((_CSingleton*)CSingleton)->instance) {return csingletonCtor(CSingleton);} else {return ((_CSingleton*)CSingleton)->instance;}
}

main.c

#include "csingleton.h"
#include <stdio.h>int main(int argc, char *argv[]) {void *ps1 = GetInstance();void *ps2 = GetInstance();if (ps1 == ps2) {fprintf(stdout, "ps1 = ps2\n");}return 0;
}

懶漢模式

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <omp.h>typedef struct ID{char *name;int id_num;
}id;static id *_id = NULL;/*通過鎖進(jìn)行并發(fā)訪問時(shí)線程間競(jìng)爭(zhēng)的控制*/
static omp_lock_t lock;id *getInstance(){omp_set_lock(&lock);if(NULL != _id) {omp_unset_lock(&lock);return _id;} else {_id = (id*)malloc(sizeof(id));assert(_id != NULL);omp_unset_lock(&lock);return _id;}
}int main(int argc, char *argv[]) {omp_set_num_threads(20);//運(yùn)行時(shí)的庫函數(shù),設(shè)置運(yùn)行的線程數(shù)目id * i1, *i2;omp_init_lock(&lock);{i1 = getInstance() ;i1->name = "Rong";i1->id_num = omp_get_thread_num();}{i2 = getInstance() ;i2->name = "Tao";}omp_destroy_lock(&lock);if(i1 == i2){fprintf(stdout, " i1 == i2 \n");}fprintf(stdout, "i1->name = %s, i1->score = %d\n",i1->name, i1->id_num);fprintf(stdout, "i2->name = %s, i2->score = %d\n",i2->name, i2->id_num);return 0;
}

C++實(shí)現(xiàn)單例模式

餓漢模式

#include <iostream>
using namespace std;class Singleon
{
private:Singleon(){cout << "Singleon()" << endl;}static Singleon* instance;
public:static Singleon* GetSingleon(){return instance;}static Singleon* Destroy(){delete instance;instance = NULL;}
};/*編譯加載類的時(shí)候即初始化,靜態(tài)成員編譯的時(shí)候即會(huì)初始化*/
Singleon* Singleon::instance = new Singleon();int main(){Singleon* sl1 = Singleon::GetSingleon();Singleon* sl2 = Singleon::GetSingleon();Singleon* sl3 = Singleon::GetSingleon();cout << sl1 << endl;cout << sl2 << endl;cout << sl2 << endl;system("pause");return 0;}

懶漢模式

#include <iostream>
using namespace std;class Singleon
{
private:Singleon(){cout << "Singleon()" << endl;}static Singleon*instrance;
public:static Singleon* GetSingleon(){if (NULL == instrance){instrance = new Singleon();cout << "對(duì)象創(chuàng)建成功" << endl;}else{cout << "對(duì)象已經(jīng)創(chuàng)建成功,無須再建" << endl;}return instrance;}static Singleon* Destroy(){delete instrance;instrance = NULL;}
};/*類加載的時(shí)候不進(jìn)行初始化,實(shí)例化的時(shí)候進(jìn)行初始化*/
Singleon* Singleon::instrance =  NULL;
int main()
{Singleon* sl1 = Singleon::GetSingleon();Singleon* sl2 = Singleon::GetSingleon();Singleon* sl3 = Singleon::GetSingleon();cout << sl1 << endl;cout << sl2 << endl;cout << sl2 << endl;system("pause");return 0;
}

總結(jié)

以上是生活随笔為你收集整理的设计模式 之美 -- 单例模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。