文档章节

设计模式学习--单例模式

丿咖啡灬微凉
 丿咖啡灬微凉
发布于 2017/04/17 23:58
字数 849
阅读 4
收藏 0

  前段时间我的学长推荐我去看一下设计模式,说这个对我做的项目会有很大的帮助,于是就开始了设计模式的学习,感觉设计模式有点枯燥乏味,如果不跟着讲解例子敲代码的话,说不定没多久我估计就睡了。

  单例模式是最常用的设计模式,在应用程序的整个生命周期中,对象只有一个实例的时候,就会使用单例模式。简而言之,就是在代码的最开始到最后,这个类只能定义一个对象,无法定义第二个对象。在单例模式的定义过程中,有两点需要注意:

  1、该类只允许存在一个实例。

  2、需要为该单一实例提供一个全局访问点。

  单一实例创建策略:通过限制构造函数(设置其为私有从而限制单例类的实例化)。之后在定义类时包含一个该类的静态私有对象,以便创建单例类的实例。

一、被动实例化   

应用方法:

class Single
{
private:
	static Single* instance;
	Single(){};
public:
	static Single getInstance()
	{
		if(instance == NULL)
		{
			instance = new Single();
		}
		return instance;
	}
};

  上述方法实现还是挺简单的,单例类由自身来维护一个对单一实例的静态引用,并由静态的getInstance()函数来返回该引用。单例模式创建单一实例的过程中使用到了一种叫做被动初始化的技术,其结果是直到第一次调用getInstance()函数时才会创建单一实例,这种技术保证单例类仅在需要时才会创建实例。

  其实就是,在定义对象的时候,因为构造函数已经被设为私有的了,所以是无法访问构造函数的,这个时候就只能通过getInstance()函数来实现了,在getInstance()函数中就可以通过静态的对象instance来控制该类定义的次数了。

  在在使用单例类的时候,一定要小心多个线程的影响,在单线程环境中,单例类会正常工作,而在多线程环境中,如果没有对获取实例的函数进行同步,就有可能创建多个实例。如果线程1刚进入if,还没有执行new语句,这个时候线程2也进入了if,这种情况下就会出现多个实例。

可以用下面这个方法避免:

class Single
{
private:
	static Single* instance;
	Single(){};
public:
	static Single getInstance()
	{
		if(instance == NULL)
		{
			pthread_mutex_lock(mutex);  
			if(instance == NULL)
			{
				instance = new Single();				
			}
			pthread_mutex_unlock(mutex); 
		}
		return instance;
	}
};


完整代码:

#include <iostream>
#include <pthread.h>

using namespace std;

static pthread_mutex_t* mutex;
class Single;

class Single  
{  
private:   
    Single(){};  
public:  
    static Single* instance; 
    static Single* getInstance()  
    {  
        if(instance == NULL)  
        {  
            pthread_mutex_lock(mutex);  
            if(instance == NULL)  
            {  
                instance = new Single();                  
            }  
            pthread_mutex_unlock(mutex);  
        }  
		else
		{
			cout<<"资源已被占用"<<endl;
		}
        return instance;  
    }  
	
	void display()
	{
		cout<<"单例模式"<<endl;
	}
};  

Single* Single::instance = NULL;

int main()
{
	pthread_mutex_init(mutex, NULL);
	Single* sing = Single::getInstance();
	sing->display();
	
	Single* s = Single::getInstance();
	s->display();
	
	
	return 0;
}



二、主动实例化

  除了上述的被动实例化之外,还可以用一个更加简洁的方法来实现相同的单例模式,但这会在加载类的时候实例化单例类。如下所示,可以实现主动实例化,同时也实现了对多线程的处理:

class Single
{
private:
	static Single instance = new Single();
	Single(){};
public:
	static Single getInstance()
	{
		return instance;
	}
};





本文转载自:http://blog.csdn.net/hjf161105/article/details/57491168

丿咖啡灬微凉
粉丝 1
博文 70
码字总数 0
作品 0
私信 提问
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.4K
69
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
274
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部