什么是设计模式:设计模式就是大佬们针对某一些特定的场景,给定的一些对应的解决方案。
设计模式分为三大类
创建型模式:共五种,工厂方法,抽象工厂,单例模式,建造者模式,原型模式
结构型模式:共七种,适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
单例模式:某一些类只应该具有一个对象(实例),就称为我们的单例模式(就相当于一个男人只有有一个合法的老婆一样)
单例模式又有饿汉模式和懒汉模式,
- 饿汉模式:程序资源使用的时候再进行加载,对象使用的时候再进行实例化,
- 懒汉模式:程序初始化的时候实例化完毕
两种单例模式的优缺点:
- 饿汉模式初始化的时候耗时比较长,但是在运行的时候因为资源已经加载完毕,此时运行的时候速度快,流畅度高。
- 懒汉模式在初始化加载快,运行的时候可能需要加载资源,所以运行的流畅度不够,(此时需要注意我们的线程安全,因为我们在运行的时候进行加载可能不同的线程对我们的全局变量进行改变的时候需要进行加锁)。
饿汉实现单例模式(吃初始化的时候加载)
template <class T>
class Singleton{
static T data;
public:
static T* GetInstance(){
return &data;
}
};
只要通富哦gingleton这个包装类来使用T对象,则一个进程中只有一个T对象
懒汉实现单例模式
template <class T>
class Signleton{
static T* inst;
public:
static T* GetInstance(){
if(inst == NULL){
inst = new T();
}
return inst;
}
} ;
此时存在一个严重的问题,线程不安全,在两个线程同时进行我们的inst==NULL的条件判断的时候就可能出现多个实例化对象,这是不行的,此时需要进行加锁进行操作
template
class Singleton{
volatile static T* inst;
static std::mutex lock;
public:
static T* GetInstance(){
if(inst == NULL){
lock.lock();
if(inst == NULL){
inst = new T();
}
lock.unlock();
}
return inst;
}
};