怎么做网站的软文推广,成都哪里可以做网站,住房和城乡建设部网站第九批,上海定制化网站开发公司文章目录 1. 单例模式 与 设计模式1.1 单例模式1.2 设计模式1.3 饿汉实现模式 与 懒汉实现模式1.4 饿汉模式① 饿汉模式的特点② 饿汉式单例模式的实现③ 饿汉式单例模式的优缺点④ 适用场景 1.5 懒汉模式① 懒汉式单例模式的特点② 懒汉式单例模式的实现③ 懒汉式单例模式的优… 文章目录 1. 单例模式 与 设计模式1.1 单例模式1.2 设计模式1.3 饿汉实现模式 与 懒汉实现模式1.4 饿汉模式① 饿汉模式的特点② 饿汉式单例模式的实现③ 饿汉式单例模式的优缺点④ 适用场景 1.5 懒汉模式① 懒汉式单例模式的特点② 懒汉式单例模式的实现③ 懒汉式单例模式的优缺点④ 适用场景 2. 智能指针 与 线程安全2.1 STL的容器是否是线程安全2.2 智能指针是否是线程安全 1. 单例模式 与 设计模式
1.1 单例模式
单例模式Singleton Pattern是一种创建型设计模式确保一个类在整个应用程序中只有一个实例并提供一个全局访问点来访问这个实例。这个模式适用于那些只需要一个实例来控制整个系统的场景如配置管理、日志记录等。
关键特性
唯一性确保类只有一个实例避免多实例带来的资源浪费和状态不一致。全局访问提供一个全局访问点使得应用程序中的所有代码能够方便地访问这个唯一实例。延迟实例化实现延迟实例化即仅在第一次访问时创建实例从而节省资源并提高启动效率。
典型实现线程安全的单例模式
class Singleton {
public:static Singleton getInstance() {static Singleton instance; // 局部静态变量保证实例唯一性return instance;}// 删除拷贝构造函数和赋值运算符以防止复制Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;private:Singleton() {} // 私有构造函数以防止外部创建实例
};1.2 设计模式
设计模式Design Pattern是面向对象设计中的一种标准化、经过验证的解决方案用于解决常见的设计问题。
设计模式的类型 创建型模式关注对象的创建过程。常见的有 单例模式Singleton工厂模式Factory Method抽象工厂模式Abstract Factory原型模式Prototype建造者模式Builder 结构型模式关注类和对象如何组合成更大的结构。常见的有 适配器模式Adapter装饰器模式Decorator代理模式Proxy桥接模式Bridge组合模式Composite外观模式Facade享元模式Flyweight 行为型模式关注对象之间的交互和责任分配。常见的有 观察者模式Observer策略模式Strategy状态模式State责任链模式Chain of Responsibility迭代器模式Iterator访问者模式Visitor模板方法模式Template Method命令模式Command解释器模式Interpreter中介者模式Mediator备忘录模式Memento
设计模式的目的
提高代码复用通过采用通用的解决方案减少代码重复提高复用性。提高代码可维护性设计模式提供了清晰的结构使得代码更易于理解和维护提升了整体可维护性。解决常见问题设计模式为常见的设计问题提供了经过验证的解决方案帮助开发人员更高效地解决问题。 1.3 饿汉实现模式 与 懒汉实现模式
单例模式分为饿汉实现 与 懒汉实现两种简单举个例子 饿汉方式吃完饭立刻洗碗下一顿吃的时候可以立刻拿着碗就能吃饭.确保资源随时可以使用 懒汉方式吃完饭, 先把碗放下, 然后下一顿饭用到这个碗了再洗碗节省了不必要的操作优化速度 接下来我们对这两种单例实现模式进行解释 1.4 饿汉模式
饿汉模式 在类被加载时就立即创建实例而不是在第一次需要实例时才创建。这种方式的特点是实例创建时机早通常用于资源不多且创建实例开销较小的情况。 ① 饿汉模式的特点
立即实例化类加载时就创建单例实例不管是否有其他地方需要这个实例。线程安全由于实例在类加载时就创建好了线程安全问题得到了天然的解决。浪费资源如果单例对象的创建开销较大而实际运行时不一定会使用这个实例则会浪费资源。 ② 饿汉式单例模式的实现
下面是饿汉实现的单例模式的示例 C
class Singleton {
public:// 提供全局访问点static Singleton getInstance() {return instance; // 直接返回已经创建好的实例}// 删除拷贝构造函数和赋值运算符以防止复制Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;private:// 构造函数是私有的以防止外部创建实例Singleton() {}// 静态成员变量类加载时就创建实例static Singleton instance;
};// 在类外定义静态成员变量
Singleton Singleton::instance;③ 饿汉式单例模式的优缺点
优点
线程安全由于实例在程序启动时即被创建因此不需要额外的同步机制来确保线程安全。简单易用实现过程简单易于理解和使用。
缺点
资源浪费即使在程序运行过程中不需要这个单例实例也会在启动时创建可能导致资源浪费。不适合大开销对象对于实例化开销较大的对象预创建可能导致不必要的资源消耗。 ④ 适用场景
实例化对象开销较小且必定会被使用。对线程安全要求较高且不介意在应用启动时立即创建实例。 1.5 懒汉模式
懒汉模式Lazy Initialization 是一种单例模式的实现方式它在第一次需要实例时才创建对象。这种方式的特点是推迟实例化从而避免不必要的资源消耗。
① 懒汉式单例模式的特点
延迟实例化对象仅在第一次被请求时才进行创建从而提高了程序的效率。资源节省在不需要实例的情况下避免了资源的浪费优化了资源使用。线程安全问题在多线程环境下可能需要额外的同步机制来确保线程安全确保实例的唯一性。
② 懒汉式单例模式的实现
下面是懒汉模式的实现 C
#include mutexclass Singleton {
public:// 提供全局访问点static Singleton* getInstance() {if (!instance) { // 如果实例尚未创建std::lock_guardstd::mutex guard(mutex); // 加锁if (!instance) { // 再次检查以避免多线程下的重复创建instance new Singleton(); // 创建实例}}return instance;}// 删除拷贝构造函数和赋值运算符以防止复制Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;private:// 构造函数是私有的以防止外部创建实例Singleton() {}// 静态成员变量保存单例实例static Singleton* instance;// 互斥锁保护实例化过程static std::mutex mutex;
};// 在类外定义静态成员变量
Singleton* Singleton::instance nullptr;
std::mutex Singleton::mutex;③ 懒汉式单例模式的优缺点
优点
节省资源实例仅在实际需要时创建从而避免了不必要的资源消耗。延迟加载能够提升程序启动速度尤其在创建单例对象开销较大的情况下尤为显著。
缺点
线程安全问题在多线程环境下可能需要额外的同步机制如使用互斥锁mutex以避免竞态条件。实现复杂度比起饿汉式单例实现更复杂需要处理多线程环境下的同步问题。 ④ 适用场景
实例化开销较大或不一定需要使用实例时。需要延迟加载优化资源使用。 2. 智能指针 与 线程安全
2.1 STL的容器是否是线程安全
不是
STL 的设计初衷是尽可能的利用性能进行高效的编码一旦涉及到加锁保证线程安全, 会对性能造成巨大的影响.对于不同的容器加锁方式的不同性能可能也不同如hash表的锁表和锁桶因此 STL 默认不是线程安全. 如果需要在多线程环境下使用 往往需要调用者自行保证线程安全 2.2 智能指针是否是线程安全
对于 unique_ptr其只在当前代码块范围内生效, 因此不涉及线程安全问题.对于 shared_ptr, 多个对象需要共用一个引用计数变量存在线程安全问题但标准库实现时考虑到了该问题基于原子操作(CAS)的方式保证 shared_ptr 能够高效, 原子的操作引用计数