设计模式之单例模式

设计模式可以分为三大类型:

创建型模式;结构型模式;行为型模式

设计模式的基本原则:(为了实现高内聚低耦合)
1)开放封闭原则
2)依赖倒置原则

3)单一职责原则
4)接口隔离原则
5)里氏替换原则
6)优先使用组合而不是继承原则
7)迪米特法则

常用设计模式1:单例模式(创建型模式)
作用:保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象

选择单例模式的原因:
在多个线程之间,比如初始化一次socket资源
在整个程序空间使用全局变量,共享资源
大规模系统中,为了性能的考虑,需要节省对象的创建时间

分类:懒汉式  第一次使用对象时创建对象

           饿汉式  在程序启动时就将对象创建好

Singleton.cpp

//单例模式  懒汉式 只存在一个实例对象
//加入线程和互斥锁

//饿汉式更优化一些,不需要线程同步


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

using namespace std;

pthread_mutex_t mutex;      //互斥量

class Singleton
{
private:
	static Singleton *mInstance;
	static int ObjectCount;
private:
	Singleton()      //构造函数声明成私有的
	{
		
	}
public:
/*	//懒汉式
	static Singleton *GetInstance()         //提供给外部创建对象的接口
	{
		ObjectCount++;
		if(mInstance==NULL)
		{
			usleep(10000);
			mInstance=new Singleton;        //懒汉式 等到构造的时候再进行初始化
		}
		return mInstance;
	}
*/	
	//饿汉式
	static Singleton *GetInstance()         //提供给外部创建对象的接口
	{
		ObjectCount++;
		return mInstance;
	}
	
	static int GetObjectCount()
	{
		return ObjectCount;
	}
	
	void release()              //析构函数
	{
		ObjectCount--;
		if(ObjectCount==0 && mInstance!=NULL)
		{
			delete mInstance;
			mInstance=NULL;
		}
	}
};

//Singleton *Singleton::mInstance = NULL;    //懒汉式   等到构造的时候再进行初始化
Singleton *Singleton::mInstance = new Singleton;    //饿汉式    提前初始化(程序启动时就将对象创建好)
int Singleton::ObjectCount = 0;           //初始化

void *Create(void *arg)
{
//	pthread_mutex_lock(&mutex);            //上锁   只有懒汉式 用得到
	Singleton *s=Singleton::GetInstance();
	cout << s << endl;
//	pthread_mutex_unlock(&mutex);           //解锁   饿汉式不需要
}


int main()
{
	/*
	Singleton *s1=Singleton::GetInstance();
	Singleton *s2=Singleton::GetInstance();
	Singleton *s3=Singleton::GetInstance();
	Singleton *s4=Singleton::GetInstance();
	Singleton *s5=Singleton::GetInstance();
	Singleton *s6=Singleton::GetInstance();
	
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	cout << s6 << endl;
	
	cout << Singleton::GetObjectCount() << endl;
	*/
	
	pthread_mutex_init(&mutex,NULL);     //初始化
	
	int i, ret;
	pthread_t tid[10];
	
	for(i=0;i<10;i++)
	{
		ret=pthread_create(&tid[i], NULL, Create, NULL);
		if(ret!=0)
		{
			perror("pthread_create");
		}
	}
	
	void *status;  
	for(i=0;i<10;i++)
	{
		pthread_join(tid[i], &status);      //等待线程结束
	}
	
	pthread_mutex_destroy(&mutex);
	
	return 0;
}

结果都是打印的同一个值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值