设计模式可以分为三大类型:
创建型模式;结构型模式;行为型模式
设计模式的基本原则:(为了实现高内聚低耦合)
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;
}
结果都是打印的同一个值