小红书网站建设内容,网站制作的评价标准,龙光城业主论坛家在深圳,微博推广运营一、设计模式概念
设计模式是被广泛使用的软件开发中的一种解决方案#xff0c;它提供了一套被验证过的、可重用的设计思想#xff0c;帮助开发人员更加高效地开发出可维护、易扩展的软件系统。 设计模式可以分为三类#xff1a;创建型模式、结构型模式和行为型模式。
1.1…一、设计模式概念
设计模式是被广泛使用的软件开发中的一种解决方案它提供了一套被验证过的、可重用的设计思想帮助开发人员更加高效地开发出可维护、易扩展的软件系统。 设计模式可以分为三类创建型模式、结构型模式和行为型模式。
1.1 创建型模式 创建型模式用于描述对象的创建过程它的目的是封装对象的创建过程从而降低系统的耦合度并且能够更加灵活地创建对象。创建型模式包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式等。 1.2 结构型模式 结构型模式用于描述如何将类或对象按某种布局组成更大的结构它涉及到接口和类的组合。结构型模式包括适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式和代理模式等。 1.3 行为型模式 结构型模式用于描述如何将类或对象按某种布局组成更大的结构它涉及到接口和类的组合。结构型模式包括适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式和代理模式等。 二、单例模式概念
单例模式是一种创建型设计模式它保证一个类只有一个实例并提供一个全局访问点。
1.将构造函数私有化将类的构造函数设为私有这样外部就无法通过构造函数来创建该类的对象。
2.提供一个静态成员变量来保存唯一实例在该类中定义一个静态成员变量用于保存该类的唯一实例。
3.提供一个静态方法来获取唯一实例在该类中定义一个静态方法用于获取该类的唯一实例。在该方法中判断静态成员变量是否为空如果为空则创建一个新的对象并赋值给静态成员变量然后返回该静态成员变量。
4.禁止复制构造函数和赋值运算符为了避免从已有对象派生出新的对象需要将复制构造函数和赋值运算符定义为私有或删除函数。
通过上述方法可以使单例类只有一个对象全局只有一个实例对象存在通过静态接口来获取该实例
2.1 饿汉模式
饿汉模式就像有种饿叫做你妈妈/奶奶觉得你饿不管你真饿假饿 我都把饭给你做好饿汉模式也一样我直接把单例对象给你初始化好完了你直接用就可以了 代码示例
class Singleton {
public:static Singleton* getInstance() { //获取单例对象的静态接口return instance;}
private:static Singleton* instance;//静态对象Singleton() {}//构造、拷贝构造、赋值设置为私有Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;
};Singleton* Singleton::instance new Singleton(); //类加载之后就直接初始化饿汉模式2.2 懒汉模式
懒汉模式就是比较懒有人要获取单例对象我才来实例化踢一脚走一步的那种 代码示例
class Singleton {
public:static Singleton* getInstance() { //获取单例对象的静态接口if (instance nullptr)//如果单例对象没有初始化则进行初始化{instance new Singleton();}return instance;}
private:static Singleton* instance;//静态对象Singleton() {}//构造、拷贝构造、赋值设置为私有Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;
};
Singleton*Singleton::instance nullptr; //初始化为 nullptr有了代码那当然要试一试单例模式怎么玩验证一下是不是真的只有一个单例对象 可以看到单例对象是唯一的
2.3 单例模式验证测试
2.3.1 饿汉模式
代码示例
#includeiostream
using namespace std;class Singleton {
public:static Singleton* getInstance() { //获取单例对象的静态接口return instance;}void Print(){cout hello world endl;}
private:static Singleton* instance;//静态对象Singleton() {}//构造、拷贝构造、赋值设置为私有Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;
};Singleton* Singleton::instance new Singleton(); //类加载之后就直接初始化饿汉模式
int main()
{//1.构造对象试试Singleton sin;//报错构造函数私有化无法在类外实例化出对象return 0;
}那么如何去调用这个单例类里面的方法呢
//调用静态方法获取单例对象(单例对象指针) 然后调用单例类中的成员函数
Singleton::getInstance()-Print();运行结果
三、单例模式是线程安全的吗
我们考虑这样一个场景两个线程懒汉模式下同时去获取这个单例对象那么在获取单例对象之前都是nullptr 那么都会同时去 new 一个单例对象导致会创建多个单例对象那么就无法实现单例模式单例对象唯一的特点 我们可以通过加锁来解决该问题
#include mutexclass Singleton {
private:static Singleton* instance;static std::mutex mtx;Singleton() {}public:static Singleton* getInstance() {if (instance nullptr) { // 第一次检查是否为空std::lock_guardstd::mutex lock(mtx); // 加锁保证线程安全if (instance nullptr) { // 第二次检查是否为空instance new Singleton();}}return instance;}// 禁止拷贝构造函数和赋值运算符Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;
};Singleton* Singleton::instance nullptr;
std::mutex Singleton::mtx;
当然了 饿汉模式是线程安全的因为单例类对象在类加载完就进行了实例化通过静态接口获取单例对象时直接获取即可无需初始化。