IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 设计模式5-单例模式 -> 正文阅读

[C++知识库]设计模式5-单例模式

引用:C++实现线程安全的单例模式 - myd620 - 博客园

单例模式-地鼠文档

5. 单例模式 — Graphic Design Patterns

单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。

../_images/Singleton.jpg

一、go语言版

package main
import "sync"
import "fmt"
type Singleton struct{}
var singleton *Singleton
var once sync.Once
func GetInstance() *Singleton {
?? ?once.Do(func(){
?? ??? ?singleton = &Singleton{}
?? ?})
?? ?return ?singleton?
}
func main() {
?? ?ins1 := GetInstance()
?? ?ins2 := GetInstance()
?? ?if ins1 == ins2 {
?? ??? ?fmt.Printf("instance is equel\n")
?? ?}
}

二、c++语言版

#include <iostream>
#include <pthread.h>
using namespace std;
template <class T>
class singleton
{
private:
? ? singleton();
? ? singleton(const singleton&){};
? ? singleton &operator=(const singleton&){};
? ? static T* m_instance;
? ? static pthread_once_t m_once;
public:
? ? static void init();
? ? static T* GetInstance();
};
class Test {
public:
? ? Test() {
? ? ? ? cout << "test construct" << endl;
? ? }
? ? void set(int a) {
? ? ? ? cout << "test show" << endl;
? ? ? ? a = a_;
? ? }
? ? int get() const {
? ? ? ? return a_;
? ? }
private:
? ? int a_;
};
template <class T>
void singleton<T>::init()
{
? ? cout << "init " << endl; ?
? ? m_instance = new T();
}
template <class T>
T *singleton<T>::GetInstance()
{
? ? pthread_once(&m_once, init);
? ? return m_instance;
}
template <class T>
pthread_once_t singleton<T>::m_once = PTHREAD_ONCE_INIT;
template <class T>
T *singleton<T>::m_instance = NULL;
int main()
{
? ? Test *t1 = singleton<Test>::GetInstance();
? ? Test *t2 = singleton<Test>::GetInstance();
? ??
? ? cout << "addread t1 " << static_cast<void *>(t1) << endl;
? ? cout << "addread t2 " << static_cast<void *>(t2) << endl;
? ?
? ? return 0;
}

三、c语言版

#include <stdio.h>
#include <pthread.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct _DATA
{
? ? int a;
? ? void *data;
}DATA;
DATA *data;
pthread_once_t m_once;
void init()
{
? ? data = (DATA *)malloc(sizeof(DATA));
? ?if(NULL == data) {
? ? ? ?printf("init failed\n");
? ? ? ?exit(-1);
? ?} else {
? ? ? ?printf("init success\n");
? ?}
}
DATA *GetInstance()
{
? ? pthread_once(&m_once, init);
? ? return data;
}
int main()
{
? ? DATA *data,*data2;
? ? data = GetInstance();
? ? data->a = 10;
? ? data2 = GetInstance();
? ? printf("data1=%d data2=%d\n",data->a, data2->a);
? ? return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-23 11:16:21  更:2021-09-23 11:17:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:16:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码