目录

什么是设计模式

单例模式的特点

单例模式的实现方式

饿汉实现方式

懒汉实现方式


什么是设计模式

        设计模式(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;
    }    
};

Logo

欢迎加入西安开发者社区!我们致力于为西安地区的开发者提供学习、合作和成长的机会。参与我们的活动,与专家分享最新技术趋势,解决挑战,探索创新。加入我们,共同打造技术社区!

更多推荐