【c++常见问题】-单例模式singleton

  通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

keyword:

  • 创建一个静态的成员变量并且这个成员变量是一个指向当前类的指针。
  • 私有的构造函数可以限制类的创建。包括拷贝构造函数
  • 提供一个静态的公有成员函数访问这个单一的静态类

非线程安全版本

 1 #include <iostream>
 2
 3 class Singleton {
 4 public:
 5     //3)提供一个公有的静态成员函数,用以访问这个单一类
 6     static Singleton * getSingleton();
 7
 8     void setValue(const int val);
 9     int getValue() const;
10
11 protected:
12     int value_;
13
14 private:
15     //1)创建一个静态的成员变量,该变量指向当前类的指针
16     static Singleton *pSingleton;
17     //2)私有的构造函数可以限制类的创建
18     Singleton();
19     Singleton(const Singleton&);
20     Singleton& operator=(const Singleton&);
21 };
22
23 //初始化静态变量
24 Singleton* Singleton::pSingleton = NULL;
25
26 //初始化成员变量
27 Singleton::Singleton():value_(0)
28 {
29 }
30
31 Singleton * Singleton::getSingleton()
32 {
33     if (NULL == pSingleton) {
34         pSingleton = new Singleton();
35     }
36     return pSingleton;
37 }
38
39 void Singleton::setValue( const int value)
40 {
41     value_ = value;
42 }
43
44 int Singleton::getValue() const
45 {
46     return value_;
47 }
48
49 int main(int argc, char const* argv[])
50 {
51     Singleton * p1 = Singleton::getSingleton();
52     p1->setValue(19);
53     Singleton * p2 = Singleton::getSingleton();
54     std::cout << "value = " << p2->getValue() << std::endl;
55     return 0;
56 }

线程安全版本-c++11

 1 …
 2 Singleton * Singleton::getSingleton()
 3 {
 4     if (NULL == pSingleton) {
 5         std::lock_guard<std::mutex> lock(_mutex);
 6         if(NULL == pSingleton) {
 7             pSingleton = new Singleton();
 8         }
 9     }
10     return pSingleton;
11 }
12 …

线程安全版本-pthread

 1 #include <iostream>
 2 #include <pthread.h>
 3
 4 class Singleton {
 5 public:
 6     //3)提供一个公有的静态成员函数,用以访问这个单一类
 7     static Singleton * getSingleton();
 8
 9     void setValue(const int val);
10     int getValue() const;
11
12 protected:
13     int value_;
14
15 private:
16     //1)创建一个静态的成员变量,该变量指向当前类的指针
17     static Singleton *pSingleton;
18     //2)私有的构造函数可以限制类的创建
19     Singleton();
20     Singleton(const Singleton&);
21     Singleton& operator=(const Singleton&);
22     static pthread_mutex_t mutex_;
23 };
24
25 //初始化互斥量
26 pthread_mutex_t Singleton::mutex_ = PTHREAD_MUTEX_INITIALIZER;
27
28 Singleton * Singleton::getSingleton()
29 {
30     if (NULL == pSingleton) {
31         pthread_mutex_lock(&mutex_);
32         if(NULL == pSingleton) {
33             pSingleton = new Singleton();
34         }
35         pthread_mutex_unlock(&mutex_);
36     }
37     return pSingleton;
38 }
1 g++ singleton.cpp -o singleton -lpthread

模板版本

 1 #include <iostream>
 2 #include <pthread.h>
 3 #include <stdlib.h>
 4 #include <stdio.h>
 5 #include <string.h>
 6
 7
 8 using std::cout;
 9 using std::endl;
10
11 template<typename T> class Singleton {
12 public:
13     //3)提供一个公有的静态成员函数,用以访问这个单一类
14     static T & getInstance();
15
16 private:
17     //1)创建一个静态的成员变量,该变量指向唯一对象的指针
18     static T * volatile pInstance_;
19     //2)私有的构造函数可以限制对象的创建
20     Singleton();
21     Singleton(const Singleton&);
22     Singleton& operator=(const Singleton&);
23     static pthread_mutex_t mutex_;
24 };
25
26 //初始化静态变量
27 template<typename T>
28 T * volatile Singleton<T>::pInstance_ = NULL;
29
30 //初始化互斥量
31 template<typename T>
32 pthread_mutex_t Singleton<T>::mutex_ = PTHREAD_MUTEX_INITIALIZER;
33
34 template<typename T>
35 T & Singleton<T>::getInstance()
36 {
37     //double-check lock
38     if (NULL == pInstance_) {
39         pthread_mutex_lock(&mutex_);
40         if(NULL == pInstance_) {
41             pInstance_ = new T;
42         }
43         pthread_mutex_unlock(&mutex_);
44     }
45     return *pInstance_;
46 }
47
48 class ApplicationImpl
49 {
50 public:
51     ApplicationImpl(){
52         cout << "ApplicationImpl()" << endl;
53     }
54
55     ~ApplicationImpl(){
56         cout << "~ApplicationImpl()" << endl;
57     }
58
59     void run(){
60         cout << "run()" << endl;
61     }
62 };
63
64 typedef Singleton<ApplicationImpl> Application;
65
66 void *routine(void *arg){
67     Application::getInstance().run();
68 }
69
70 int main(int argc, char const* argv[])
71 {
72
73     Application::getInstance().run();
74
75     pthread_t tid;
76     int ret;
77     ret = pthread_create(&tid, NULL, routine, NULL);
78     if( ret != 0 )
79     {
80         fprintf(stderr, "pthread create:%s\n", strerror(ret));
81         exit(EXIT_FAILURE);
82     }
83
84     Application::getInstance().run();
85
86     pthread_join(tid,NULL);
87
88     return 0;
89 }
时间: 2024-11-04 08:28:14

【c++常见问题】-单例模式singleton的相关文章

.Net 单例模式(Singleton)

每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中.每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况.每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用. 问题描述: 单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这

单例模式——Singleton

模式分类: 从目的来看: 1.创建型(Creational)模式:负责对象创建. 2.结构型(Structural)模式:处理类于对象间的组合. 3.行为型(Behavioral)模式:类与对象交互中的职责分配. 从范围看: 1.类模式处理类于子类的静态关系. 2.对象模式处理对象间的动态关系. 动机 在软件系统中,经常有一些这样特殊的类,必须保证他们在系统中只存在一个实例,才能确保他们的逻辑正确性.以及良好的效率. 绕过常规的构造器,提供一种机制保证一个类只有一个实例. 意图 保证一个类仅有一

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

设计模式之——单例模式(Singleton)的常见应用场景(转):

单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一. 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html . 好多没怎么使用过的人

Android - 单例模式(singleton)的使用

单例模式(singleton)的使用 本文地址:http://blog.csdn.net/caroline_wendy 单例(singleton)是特殊的Java类,在创建实例时,一个类仅允许创建一个实例. 应用能够在内存里存多久,单例就能存在多久,因此将对象列表保存在单例里可保持crime数据的一直存在, 不管activity.fragment及它们的生命周期发生什么变化. 要创建单例,需创建一个带有私有构造方法及get()方法类,其中get()方法返回实例. 如实例已存在,get()方法则直

二十四种设计模式:单例模式(Singleton Pattern)

单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using System.Collections.Generic; using System.Text; namespace Pattern.Singleton { /// <summary> /// 泛型实现单例模式 /// </summary> /// <typeparam name=&q

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

Android设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

设计模式之单例模式——Singleton

                    设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有公开的调用方法.而且,别的类不能实例化它,所以构造方法要设置为私有的. 单例模式的要点 一是某个类只能有一个实例: 二是它必须自行创建这个实例: 三是它必须自行向整个系统提供这个实例. 例如: 有一个"单例对象",而"客户甲"."客户乙" 和&quo