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

贵阳拍卖网站开发公司dedecms 调用网站内部搜索

贵阳拍卖网站开发公司,dedecms 调用网站内部搜索,扁平化 手机网站首页,建站教程图解常见手撕项目C 设计模式单例模式饿汉模式懒汉模式 策略模式策略接口实现具体的策略#xff08;虚函数重写#xff09;定义上下文用户调用 设计模式 单例模式 单例模式是一种常用的软件设计模式#xff0c;其目的是确保一个类只有一个实例#xff0c;并提供一个全局访问点来… 常见手撕项目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 mutexclass 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_guardstd::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_ptrStrategy strategy; // 使用独占的智能指针// 使用右值引用来接收一个unique_ptr并提供默认参数(即调用这个函数的时候可以不用传入参数)Context(unique_ptrStrategy strategy {}): strategy(std::move(strategy)){}// 设置接口到底执行哪一个函数void setStrategy(unique_ptrStrategy strategy){strategy std::move(strategy);}// 执行具体函数void excuteStrategy() const{if(strategy){strtegy-excute();}} }用户调用 int main(){// 需要注意make_uniqueStrategyA()是一个不具名的右值所以可以正确调用右值构造函数Context context(make_uniqueStrategyA());context.excuteStrategy(); // 输出StrategyA// 动态切换策略context.setStrategy(make_uniqueStrategyB());context.excuteStrategy(); // 输出StrategyBcontext.setStrategy(make_uniqueStrategyC());context.excuteStrategy(); // 输出StrategyCreturn 0; }
http://www.hkea.cn/news/14522219/

相关文章:

  • vue做网站免费网页源码
  • 青海西宁网站开发公司苏州工业园区教育局官网
  • 流浪猫狗救助网站开发设计公司名称变更
  • 网站域名改了帝国cms教育app定制开发
  • 做服装网站设计书莱芜百姓网
  • 重庆建站服务商网站开发教学大纲
  • 深圳建设网站软件界面设计与色彩搭配
  • 太原有网站工程公司吗wordpress主题汉化包放哪里
  • 检测asp网站死循环wordpress lovevideo
  • 成品网站源码在线常德网站建设专业品牌
  • 广州电商网站建设做优秀网站
  • 怎么做狼视听网站更改wordpress主题语言包
  • 免费的域名注册网站金华住房和城乡建设厅网站
  • 网站不备案能访问吗骨干校 建设网站
  • 网站建设实习心得网站没有备案做竞价吗
  • 龙泉驿区建设局网站wordpress多合一seo包
  • wordpress加载谷歌seo千享科技
  • 工程信息平台广州seo优化代理
  • 谢岗镇做网站开个广告公司大概需要多少钱
  • 企业类网站模板免费下载业务网站建设
  • 室内设计接单网站企业网站建设版本
  • 广东网站建设哪家专业佛山营销网站建设服务公司
  • 网站平台建设实训心得体会河北抖音seo系统
  • 更新网站怎么弄线上销售渠道有哪几种
  • 模板建站难度大美图秀秀网页版
  • 简单网站的制作wordpress 产品报价系统
  • phpmysql网站开发wordpress 关闭伪静态
  • 建设网站最好的网络营销服务有限公司
  • 深圳做网站哪家公司专业成都本地宝新闻动态
  • 深圳品牌月饼排名seo刷关键词排名软件