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

面向对象的设计模式

一、设计模式简介

1、什么是设计模式

针对反复出现的问题所总结归纳出的通用解决方设计模式是指在软件开发过程中案。这些方案是众多软件开发人员经过大量实践总结出来的,具有高效性、可维护性和可扩展性等优点。使用设计模式可以帮助开发者更高效地构建软件系统,提高代码的复用性、可维护性和可扩展性,同时也能降低系统的耦合度。

2、设计模式分类

大体上设计模式分为3中类型:创建型、结构型和代码型

23种设计模式

二、单例设计模式

其特点是只提供唯一一个类的设计模式,具有全局变量的特点,在任何位置都可以通过接口获取到唯一实例。他的优点显而易见:

他能够避免对象重复创建,节约空间并提升效率

避免由于操作不同实例导致的逻辑错误

单例模式有两种实现模式:饿汉式和懒汉式

饿汉:饿了肯定要饥不择⻝。所以在单例类定义的时候就进⾏实例化。

懒汉:在第⼀次⽤到类实例的时候才会去实例化。什么时候使⽤,什么时候创建单例

#include <iostream>
#include <string>
#include<memory>using namespace std;
//单例的 饿汉模式的实现--特点:在定义类的时候就创建了一个对象
class Singleton
{public://Singleton(const Singleton&temp )=delete;static Singleton*get_instance(){return instance;}void test(){cout << "测试"<<this << endl;}private:Singleton()=default;//Singleton(const Singleton&temp )=default;	Singleton(const Singleton&temp )=default;Singleton& operator=(const Singleton&temp)=default;static Singleton*instance;};Singleton*Singleton::instance=new Singleton;int main()
{Singleton *obj1=	Singleton::get_instance();Singleton *obj2=	Singleton::get_instance();obj1->test();obj2->test();return 0;
}
//测试0x1fb01e91750
//测试0x1fb01e91750

#include <iostream>
#include <string>
#include<memory>using namespace std;
//单例的 懒汉模式的实现--特点:第一次用类的实例才创建对象
//对于多线程环境下 饿汉模式它是线程安全的,对于懒汉模式在多线程下是不全的。
class Singleton
{public://Singleton(const Singleton&temp )=delete;static Singleton*get_instance(){if(instance==nullptr){instance=new Singleton;}return  instance;}void test(){cout << "测试"<<this << endl;}private:Singleton()=default;//Singleton(const Singleton&temp )=default;	Singleton(const Singleton&temp )=default;Singleton& operator=(const Singleton&temp)=default;static Singleton*instance;};Singleton*Singleton::instance=nullptr;int main()
{Singleton *obj1=	Singleton::get_instance();Singleton *obj2=	Singleton::get_instance();obj1->test();obj2->test();return 0;
}
//测试0x1fb01e91750
//测试0x1fb01e91750
#include <iostream>
#include <string>
#include<memory>
#include<mutex>using namespace std;
//单例的 懒汉模式的实现--特点:第一次用类的实例才创建对象
//对于多线程环境下需要加锁实现实例的唯一性, 对于懒汉模式在多线程下是不安全的。
class Singleton
{public:static Singleton*get_instance(){if(instance==nullptr){lock.lock();if(instance==nullptr){instance=new Singleton;}lock.unlock();}return  instance;}void test(){cout << "测试"<<this << endl;}private:Singleton()=default;//Singleton(const Singleton&temp )=default;	Singleton(const Singleton&temp )=default;Singleton& operator=(const Singleton&temp)=default;static Singleton*instance;static mutex lock;};Singleton*Singleton::instance=nullptr;
mutex Singleton::lock;//通过该类的默认构造函数来进行初始化,默认初始化为不上锁状态int main()
{Singleton *obj1=	Singleton::get_instance();Singleton *obj2=	Singleton::get_instance();obj1->test();obj2->test();return 0;
}
//测试0x1fb01e91750
//测试0x1fb01e91750

基础要点: 全局只有⼀个实例:static 特性,同时禁⽌⽤户⾃⼰声明并定义实例(把构造 函数设为 private) 线程安全 禁⽌赋值和拷⻉ ⽤户通过接⼝获取实例:使⽤ static 类成员函数

关于如何选择懒汉和饿汉模式:

懒汉:在访问量较⼩时,采⽤懒汉实现。这是以时间换空间。

饿汉:由于要进⾏线程同步,所以在访问量⽐较⼤,或者可能访问的线程⽐较 多时,采⽤饿汉实现,可以实现更好的性能。这是以空间换时间。

加了锁,使⽤互斥量来达到线程安全。这⾥使⽤了两个 if 判断语句的技术称为 双检锁;好处是,只有判断指针为空的时候才加锁,避免每次调⽤ getInstance 的⽅法都加锁,锁的开销毕竟还是有点⼤的。

http://www.dtcms.com/a/279316.html

相关文章:

  • 【数据结构】树(堆)·上
  • js的局部变量和全局变量
  • 测试驱动开发(TDD)实战:在 Spring 框架实现中践行 “红 - 绿 - 重构“ 循环
  • Bash vs PowerShell | 从 CMD 到跨平台工具:Bash 与 PowerShell 的全方位对比
  • vue3 服务端渲染时请求接口没有等到数据,但是客户端渲染是请求接口又可以得到数据
  • 7.14 map | 内存 | 二维dp | 二维前缀和
  • python+Request提取cookie
  • 电脑升级Experience
  • python transformers笔记(Trainer类)
  • 代码随想录算法训练营第三十五天|416. 分割等和子集
  • LLM表征工程还有哪些值得做的地方
  • 内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?
  • 防火墙技术概述
  • Qt轮廓分析设计+算法+避坑
  • Redis技术笔记-主从复制、哨兵与持久化实战指南
  • 第五章 uniapp实现兼容多端的树状族谱关系图,剩余组件
  • 学习C++、QT---25(QT中实现QCombobox库的介绍和用QCombobox设置编码和使用编码的讲解)
  • SQL ORM映射框架深度剖析:从原理到实战优化
  • 【Unity】MiniGame编辑器小游戏(十三)最强射手【Shooter】(下)
  • ElasticSearch重置密码
  • 嵌入式 Linux开发环境构建之Source Insight 的安装和使用
  • c++算法二
  • 不同Linux版本下安装Synopsys工具的差异与选择建议
  • PyTorch 数据加载全攻略:从自定义数据集到模型训练
  • [Pytorch]深度学习-part1
  • 策略模式及优化
  • LangChain面试内容整理-知识点16:OpenAI API接口集成
  • Linux操作系统之信号:信号的产生
  • 观察应用宝进程的自启动行为
  • Spring Boot启动原理:从main方法到内嵌Tomcat的全过程