【C++】单例模式
目录
什么是设计模式
设计模式(Design Patterns)是在软件工程中,针对软件设计过程中经常出现的问题而提出的一些经过分类、编码、测试和验证的,可复用的解决方案。这些解决方案是描述如何解决一类问题的最佳实践,它们可以帮助开发者设计出更加灵活、可重用、易于理解和维护的代码。
常见的设计模式有单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)和对象池模式(Object Pool)
单例模式的特点
某些类,只应该具有一个对象(实例),就称之为单例,也就是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。
单例模式的核心思想是将类的实例化控制权交给类 本身,而不是交给客户端(即使用者)。这样,客户端就无法通过new关键字来直接实例化对象,从而保证了全局只有一个实例。
单例模式的实现方式
单例模式的实现方式有两种,这里用洗碗的例子:
饿汉实现方式
吃完饭,立刻洗碗,这种就是饿汉方式,因为下一顿吃的时候就可以立刻拿着碗就能吃饭。
template <typename T>
class Singleton{
static T data;
public:
static T* GetInstance(){
return &data;
}
};
全局变量在程序运行时就加载的,生命周期随进程
懒汉实现方式
吃完饭,先把碗放下,然后下一顿饭用到这个碗了再洗碗,这就是懒汉模式,懒汉模式最核心的思想是“延时加载”,从而能够优化服务器的启动速度.
template <typename T>
class Singleton{
static T* inst;
public:
static T* GetInstance(){
if(inst==nullptr)
{
inst=new T();
}
return inst;
}
};
存在一个严重的问题,线程不安全,第一次调用Getinstance,如果两个线程同时调用,可能会创建出两份T对象的实例,但是后续调用就没事了
使用单例模式需要私有化删除构造和赋值方法,防止形成临时对象,或者第二个对象的方法全部私有化并删除
ThreadPool(const ThreadPool<T>&)=delete; //拷贝构造
const ThreadPool<T>& operator=(const ThreadPool<T>&) =delete;//a=b=c
因此需要解决线程安全
template <typename T>
class Singleton{
static T* inst;
public:
static T* GetInstance(){//不能再这里直接加锁,因为虽然解决了并发问题,但是效率问题未得到解决
if(inst==nullptr)
{pthread_mutex_lock(&lock_);
if(inst==nullptr)
{
inst=new T();}
pthread_mutex_unlock(&lock_);
}
return inst;
}
};
更多推荐



所有评论(0)