当前位置: 首页 > news >正文

哪些网站可以做宣传东莞seo广告宣传

哪些网站可以做宣传,东莞seo广告宣传,百度爱采购优化,做结婚视频储存网站常见手撕项目C 设计模式单例模式饿汉模式懒汉模式 策略模式策略接口实现具体的策略(虚函数重写)定义上下文用户调用 设计模式 单例模式 单例模式是一种常用的软件设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来…

常见手撕项目C++

  • 设计模式
    • 单例模式
      • 饿汉模式
      • 懒汉模式
    • 策略模式
      • 策略接口
      • 实现具体的策略(虚函数重写)
      • 定义上下文
      • 用户调用

设计模式

单例模式

在这里插入图片描述
单例模式是一种常用的软件设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

  • 优点:
    • 资源控制:单例模式能够确保一个类只有一个实例存在,这对于控制资源的使用非常有用,如配置文件的读取、数据库的连接等,可以避免由于多个实例造成的资源浪费或冲突。
    • 全局访问点:单例对象可以被全局访问,方便其他对象对其进行访问,而无需持有单例类的引用。
    • 数据共享:由于整个应用程序共享一个单例实例,它自然地提供了一个共享数据的环境,这在某些场合下是非常有用的。
  • 缺点:
    • 全局变量(同步)问题:单例模式本质上提供了一个全局可访问的实例,但全局变量(或对象)容易被误用,特别是涉及多个线程进行访问的时候,还会出现同步问题。
    • 违背单一职责原则:单例类除了管理自己的实例外,还承担了业务逻辑的职责,违反了单一职责原则。

介绍完单例模式,我们来看看单例模式的两种实现方式,分别是饿汉模式与懒汉模式。

饿汉模式

在这里插入图片描述

饿汉模式指的是单例实例在程序启动时就立即创建(迫不及待的感觉)。这种方式避免了线程安全问题,但可能会增加程序的启动时间,同时如果实例最终未被使用,则会造成资源的浪费。

class EagerSingleton{
private:// 将自己的实例化对象申明为静态资源static EagerSingleton instance;
protected:// 隐藏自己的构造函数以及析构函数,防止用户调用EagerSingleton() = default; // 这里构造函数设置为默认EagerSingleton(const EagerSingleton&) = default;EagerSingleton& operator= (const EagerSingleton&) = default;~EagerSingleton() = default;
public:EagerSingleton& getInstance(){return instance;}
}// 静态的私有成员变量可以在类外进行初始化(一般在main()函数之前进行初始化),在这里,你可以理解instance是类内成员,可以访问私有以及保护成员。
EagerSingleton EagerSingleton::instance();

懒汉模式

在这里插入图片描述
懒汉模式指的是单例实例在第一次被使用时才进行创建(不叫我,那我就懒,不创建)。这种方式可以减少资源的消耗,但需要考虑线程安全问题(例如多个线程同时是第一次使用,所以一般需要锁)。

#include <mutex>class lazySingleton{
private:static lazySingleton* instance; // 懒汉模式一般使用指针static mutex my_mu; // 考虑到线程安全,需要有锁。
protected:// 不给用户调用构造函数和析构函数的机会lazySingleton() = default;lazySingleton(const lazySingleton&) = default;lazySingleton& operator=(const laySingleton&) = default;~lazySingleton() = default;
public:lazySingleton* getInstance(){if(instance == nullptr){ // 第一次检查std::lock_guard<std::mutex> lock(my_mu); //作用域锁,离开作用域后,自动解锁if(instance == nullptr){ // 第二次检查instance = new lazySingleton();}}return *this;}// my_mu会在这里结束后,自动解锁
}// 静态成员变量类外初始化
lazySingleton lazySingleton::instance = nullptr;
lazySingleton lazySingleton::my_mu; // 调用锁的自动初始化方法

这里可能会好奇,为什么需要两次判断instance == nullptr

  • 第一次检查 (instance == nullptr)
    第一次检查是在锁外进行的。这个检查的目的是避免在单例实例已经创建之后的每次调用都需要进行昂贵的锁操作。如果实例已经存在,就直接返回实例,这样大部分时间可以避免锁的开销。
  • 获取锁
    如果第一次检查发现实例为nullptr,即单例尚未被创建,那么就需要进入同步块(通过获取锁)来确保只有一个线程可以创建单例实例。这是必要的,因为可能有多个线程同时通过了第一次的nullptr检查。
  • 第二次检查 (instance == nullptr)
    即使线程成功获取了锁,仍然需要再次检查实例是否为nullptr。这是因为在当前线程等待锁的同时,可能有另一个线程已经获取了锁、创建了实例并释放了锁。第二次检查确保了即使在多个线程同时尝试创建单例实例的情况下,单例实例仍然是唯一的。

策略模式

在这里插入图片描述
策略模式是一种行为设计模式,它允许在运行时选择算法或行为的最佳策略。策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互换。这种模式让算法的变化独立于使用算法的客户。

策略接口

首先,要定义一个策略接口,表示可以执行的操作

class Strategy{
public:virtual ~Strategy(){};virtual void excute() const = 0; // 操作定义为纯虚函数
}

实现具体的策略(虚函数重写)

然后,利用继承,实现不同且具体的策略

class StrategyA : public Strategy{
public:void excute() const override{ //override 关键字表示一定是重写虚函数,避免出现覆盖的情况(如果有存在的话)cout << "StrategyA" << endl;}
}class StrategyB : public Strategy{
public:void excute() const override{ //override 关键字表示一定是重写虚函数,避免出现覆盖的情况(如果有存在的话)cout << "StrategyB" << endl;}
}class StrategyB : public Strategy{
public:void excute() const override{ //override 关键字表示一定是重写虚函数,避免出现覆盖的情况(如果有存在的话)cout << "StrategyB" << endl;}
}

定义上下文

接着,定义一个上下文类,用于从客户端接收策略,并使用它执行操作

#include <iostream>
#include <memory> // 智能指针共享库
using namespace std;class Context{
public:unique_ptr<Strategy> strategy; // 使用独占的智能指针// 使用右值引用来接收一个unique_ptr,并提供默认参数(即调用这个函数的时候可以不用传入参数)Context(unique_ptr<Strategy> &&strategy = {}): strategy(std::move(strategy)){}// 设置接口到底执行哪一个函数void setStrategy(unique_ptr<Strategy> &&strategy){strategy = std::move(strategy);}// 执行具体函数void excuteStrategy() const{if(strategy){strtegy->excute();}}
}

用户调用

int main(){// 需要注意make_unique<StrategyA>()是一个不具名的右值,所以可以正确调用右值构造函数Context context(make_unique<StrategyA>());context.excuteStrategy(); // 输出:StrategyA// 动态切换策略context.setStrategy(make_unique<StrategyB>());context.excuteStrategy(); // 输出:StrategyBcontext.setStrategy(make_unique<StrategyC>());context.excuteStrategy(); // 输出:StrategyCreturn 0;
}

文章转载自:
http://externe.stph.cn
http://resettle.stph.cn
http://wearable.stph.cn
http://bofors.stph.cn
http://spinning.stph.cn
http://chief.stph.cn
http://empathy.stph.cn
http://uncontemplated.stph.cn
http://postulator.stph.cn
http://tripinnate.stph.cn
http://sinicize.stph.cn
http://soucar.stph.cn
http://galley.stph.cn
http://mixen.stph.cn
http://rhaetic.stph.cn
http://pict.stph.cn
http://spilth.stph.cn
http://gneissic.stph.cn
http://scaletail.stph.cn
http://generation.stph.cn
http://upspring.stph.cn
http://chronosphere.stph.cn
http://fibro.stph.cn
http://haemopoiesis.stph.cn
http://decistere.stph.cn
http://sleepy.stph.cn
http://aiche.stph.cn
http://balletomania.stph.cn
http://aparejo.stph.cn
http://coaction.stph.cn
http://recast.stph.cn
http://mesopotamia.stph.cn
http://twicer.stph.cn
http://cokernut.stph.cn
http://thunderbolt.stph.cn
http://reinspect.stph.cn
http://picasso.stph.cn
http://vexillum.stph.cn
http://winterbeaten.stph.cn
http://repose.stph.cn
http://perilymph.stph.cn
http://dystocia.stph.cn
http://refreshment.stph.cn
http://derby.stph.cn
http://debenture.stph.cn
http://alate.stph.cn
http://shellless.stph.cn
http://unsmart.stph.cn
http://bryce.stph.cn
http://lorn.stph.cn
http://atropos.stph.cn
http://pit.stph.cn
http://undertaken.stph.cn
http://metayer.stph.cn
http://cursillo.stph.cn
http://contadino.stph.cn
http://undetermined.stph.cn
http://electrokymograph.stph.cn
http://forager.stph.cn
http://medroxyprogesterone.stph.cn
http://photopile.stph.cn
http://rubious.stph.cn
http://spuriously.stph.cn
http://trumpetweed.stph.cn
http://epicondylic.stph.cn
http://altarpiece.stph.cn
http://supposition.stph.cn
http://ariel.stph.cn
http://finestra.stph.cn
http://chaqueta.stph.cn
http://timbales.stph.cn
http://inglorious.stph.cn
http://adversity.stph.cn
http://coadjustment.stph.cn
http://checkgate.stph.cn
http://zygodactyl.stph.cn
http://flagleaf.stph.cn
http://rouseabout.stph.cn
http://palisander.stph.cn
http://lunarian.stph.cn
http://concordance.stph.cn
http://kolo.stph.cn
http://trackman.stph.cn
http://sharif.stph.cn
http://zinco.stph.cn
http://heptose.stph.cn
http://felv.stph.cn
http://muleta.stph.cn
http://astrophotography.stph.cn
http://pnya.stph.cn
http://israeli.stph.cn
http://bengalee.stph.cn
http://originally.stph.cn
http://sarcomata.stph.cn
http://methene.stph.cn
http://omnipotence.stph.cn
http://guichet.stph.cn
http://intergrowth.stph.cn
http://vestibulospinal.stph.cn
http://gyroplane.stph.cn
http://www.15wanjia.com/news/57525.html

相关文章:

  • 校园失物招领网站建设江苏seo和网络推广
  • 著名的深圳网站建设网站推广怎样做
  • 湖州市网站建设0元入驻的电商平台
  • 编写html的软件长沙正规竞价优化服务
  • 人人做全免费网站网店推广的重要性
  • 企业网站公众号软件测试培训
  • 怎么敲代码做网站发稿服务
  • 网站开发dede南宁seo专员
  • 机票网站制作sem是指什么
  • 我想建一个做私彩的网站seo网站编辑是做什么的
  • 合肥公司做网站线上推广
  • 网站建设备案方案中国优秀网页设计案例
  • 做详情页到那个网站找模特素材网店运营基础知识
  • 茶叶网站的建设策划书关键词优化排名软件怎么样
  • 建公司网站的详细步骤无锡网络推广外包
  • go语言可以做网站吗百度优化大师
  • 挪车码推广赚钱站长工具seo综合查询源码
  • 做模具做什么网站浙江网站推广运营
  • 做网站怎么赚钱种子在线资源搜索神器
  • seo优化网站建设公司女生做sem专员的工作难吗
  • 做静态网站软件正规营销培训
  • 广州专业网站制作平台seo策略有哪些
  • wordpress更改主题的响应厦门seo网络推广
  • 上海做什么工作最赚钱秦洁婷seo博客
  • asp动态网站建设毕业设计小红书关键词排名优化
  • 网站开发的基本原则百度推广自己怎么做
  • 为企业做网站要向谁索要资料余姚关键词优化公司
  • 苏州做网站需要多少钱怎么优化推广自己的网站
  • 港港网app下载最新版西安百度推广优化
  • 郑州第一附属医院不孕不育科武安百度seo