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

做网站的合作案例搜狐财经峰会

做网站的合作案例,搜狐财经峰会,wordpress 博客页面,做俄罗斯网站一、单例模式简介 单例模式(Singleton Pattern)是一种创建型设计模式(GoF书中解释创建型设计模式:一种用来处理对象的创建过程的模式),单例模式是其中的一种,它确保一个类只有一个实例&#xff…

一、单例模式简介

        单例模式(Singleton Pattern)是一种创建型设计模式(GoF书中解释创建型设计模式:一种用来处理对象的创建过程的模式),单例模式是其中的一种,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这个模式适用于那些需要一个全局唯一的对象来协调系统中的行为的情况。即在整个程序运行过程中,该类只存在一个对象(实例)。

GoF一书对单例模式的介绍

 二、单例模式的用处

单例模式常见的使用场景

  • 配置管理:全局配置管理器,确保配置只被加载一次并在全局范围内一致。
  • 日志记录:全局日志记录器,确保所有日志信息被记录在一个地方。
  • 线程池:全局线程池管理,避免多个线程池实例带来的资源浪费。
  • 数据库连接池:全局数据库连接池,统一管理数据库连接的创建和销毁

单例模式的优点包括:

1. 确保全局唯一性

  • 唯一性:单例模式确保一个类只有一个实例。这对于那些需要全局唯一的资源或管理类非常重要,例如配置管理器、日志记录器等。

  • 全局访问:单例模式提供了一个全局访问点来获取这个唯一实例,使得所有代码都可以通过统一的方式来访问该实例。

2. 控制资源访问

  • 资源管理:在某些情况下,某些资源(如数据库连接、线程池)只能由一个实例进行管理。使用单例模式可以有效地控制这些资源的创建和销毁,避免资源的重复创建和管理。

  • 性能优化:通过避免创建多个实例,单例模式可以减少系统开销和资源浪费。

3. 简化接口

  • 简化使用:由于只有一个实例,使用单例模式的类不需要考虑实例的创建和管理,使用时更简单直观。

  • 一致性:可以保证对全局状态的一致性和统一管理,减少了不同实例间的状态不一致问题。

4. 延迟实例化

  • 懒加载:通过懒汉式实现,单例模式可以实现延迟初始化(即实例在第一次使用时创建),从而提高系统启动速度并节省资源,直到确实需要实例时才创建它。

5. 避免多次实例化

  • 避免浪费:有些对象的创建和初始化代价较高,使用单例模式可以避免重复创建这些对象,从而节省计算资源和时间。

三、单例模式的设计步骤

a)私有化构造函数

b)提供一个全局的静态方法(全局访问点)

c)在类中定义一个静态指针,指向该类的对象(静态指针由全局访问点获取)

四、单例模式的两种设计方法

1)懒汉式(Lazy Initialization

这种设计方式只有在第一次使用时才会创建实例,这种方式的优点是延迟初始化。通常使用静态局部变量来实现线程安全的懒加载。

2)饿汉式(Eager Initialization

在这种实现中,单例实例在程序启动时就被创建。也就是不管有没有被使用,只要程序运行就会创建该对象。这个实现简单,但如果单例实例的创建开销较大,可能会导致程序启动变慢,且可能会浪费资源。

懒汉式代码示例:

lazy.cpp

#include <iostream>//Lazy Initialization
class Singleton {
public:// 获取单例实例的公共方法static Singleton& getInstance() {static Singleton instance; // 静态局部变量,线程安全return instance;}// 禁止复制构造函数和赋值操作符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 其他成员变量和方法void doWorking() const {std::cout<<"我是懒汉式创建型设计模式——单例模式! "<<std::endl;}private:Singleton() {} // 私有构造函数};// 使用示例
int main() {Singleton& singleton = Singleton::getInstance();Singleton* ptr = &Singleton::getInstance();//判断是否调用同一个对象if ( &singleton == ptr){std::cout<<"我们是同一个对象! "<<std::endl;}else{std::cout<<"我们是不同的对象! "<<std::endl;}//调用对象的方法singleton.doWorking();ptr->doWorking();return 0;
}

运行效果

 

饿汉式代码示例:

eager.cpp

#include <iostream>//Eager Initialization
class Singleton {
public:// 获取单例实例的公共方法static Singleton& getInstance() {return instance;}// 禁止复制构造函数和赋值操作符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 其他成员变量和方法void doWorking() const {std::cout<<"我是饿汉式创建型设计模式——单例模式! "<<std::endl;}private:Singleton() {} // 私有构造函数static Singleton instance; // 声明静态成员};Singleton Singleton::instance; // 定义并初始化静态成员(只要程序运行就创建该实例)// 使用示例
int main() {Singleton& singleton = Singleton::getInstance();Singleton* ptr = &Singleton::getInstance();//判断是否调用同一个对象if ( &singleton == ptr){std::cout<<"我们是同一个对象! "<<std::endl;}else{std::cout<<"我们是不同的对象! "<<std::endl;}//调用对象的方法singleton.doWorking();ptr->doWorking();return 0;
}

运行效果

3)单例模式的线程安全问题

使用饿汉式方法创建单例模式,如果不使用静态局部变量,而是使用裸指针+判断的方式创建单例,很容易引发多线程的资源竞争问题。(线程在空闲状态下可以挂起)

使用双重检查锁定(Double-Checked Locking)来确保多线程环境下的单例创建的安全性。

示例代码:

doubleLock.cpp

#include <iostream>
#include <mutex>//线程安全的双重检查锁定
class Singleton {
public:static Singleton* getInstance() {if (!instance) {std::lock_guard<std::mutex> lock(mutex);if (!instance) {instance = new Singleton();}}return instance;}// 禁止复制构造函数和赋值操作符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 其他成员变量和方法void doWorking() const {std::cout<<"我是懒汉式单例模式——我使用了双重检查锁定保证我的创建安全! "<<std::endl;}private:Singleton() {} // 私有构造函数//类中声明静态变量static Singleton* instance;static std::mutex mutex;};Singleton* Singleton::instance = nullptr;    //定义并初始化指针为空
std::mutex Singleton::mutex;    //定义并初始化互斥锁// 使用示例
int main() {Singleton* singleton = Singleton::getInstance();Singleton* ptr = Singleton::getInstance();//判断是否调用同一个对象if (singleton == ptr){std::cout<<"我们是同一个对象! "<<std::endl;}else{std::cout<<"我们是不同的对象! "<<std::endl;}//调用对象的方法singleton->doWorking();ptr->doWorking();return 0;
}

运行效果

 

23种设计模式中,单例模式是比较简单的一种,但是涉及到的知识面也是很多的,比如线程、互斥、同步等。 后面我还会继续讲解其他设计模式,敬请期待啦(¬‿¬)


文章转载自:
http://kauri.xqwq.cn
http://wladimir.xqwq.cn
http://dialectician.xqwq.cn
http://civilise.xqwq.cn
http://radioscopic.xqwq.cn
http://hardie.xqwq.cn
http://grin.xqwq.cn
http://expellent.xqwq.cn
http://permute.xqwq.cn
http://remove.xqwq.cn
http://antiscriptural.xqwq.cn
http://dinky.xqwq.cn
http://irradiate.xqwq.cn
http://registrant.xqwq.cn
http://locule.xqwq.cn
http://coatee.xqwq.cn
http://scaup.xqwq.cn
http://adhocery.xqwq.cn
http://uncandid.xqwq.cn
http://enunciation.xqwq.cn
http://multilobate.xqwq.cn
http://godless.xqwq.cn
http://mongrel.xqwq.cn
http://engineman.xqwq.cn
http://demonstratively.xqwq.cn
http://loculation.xqwq.cn
http://labor.xqwq.cn
http://galpon.xqwq.cn
http://collimate.xqwq.cn
http://kafiri.xqwq.cn
http://bump.xqwq.cn
http://baiao.xqwq.cn
http://brainpan.xqwq.cn
http://hybrid.xqwq.cn
http://groyne.xqwq.cn
http://npn.xqwq.cn
http://exinanition.xqwq.cn
http://penny.xqwq.cn
http://soerabaja.xqwq.cn
http://unseemly.xqwq.cn
http://birch.xqwq.cn
http://classable.xqwq.cn
http://bismillah.xqwq.cn
http://jedediah.xqwq.cn
http://dunner.xqwq.cn
http://autolithograph.xqwq.cn
http://pollee.xqwq.cn
http://vair.xqwq.cn
http://embroidery.xqwq.cn
http://ezra.xqwq.cn
http://procession.xqwq.cn
http://naha.xqwq.cn
http://subsere.xqwq.cn
http://logarithmize.xqwq.cn
http://hydrocyclone.xqwq.cn
http://irised.xqwq.cn
http://lyophilize.xqwq.cn
http://roadsigns.xqwq.cn
http://northwestern.xqwq.cn
http://aciniform.xqwq.cn
http://variational.xqwq.cn
http://knapweed.xqwq.cn
http://zygomata.xqwq.cn
http://slickster.xqwq.cn
http://quarrelsomeness.xqwq.cn
http://hexagonal.xqwq.cn
http://leotard.xqwq.cn
http://patriarchy.xqwq.cn
http://conterminous.xqwq.cn
http://crossite.xqwq.cn
http://sobersides.xqwq.cn
http://emulative.xqwq.cn
http://doorway.xqwq.cn
http://uncompassionate.xqwq.cn
http://pneumatics.xqwq.cn
http://croc.xqwq.cn
http://domiciliate.xqwq.cn
http://constrict.xqwq.cn
http://antibiosis.xqwq.cn
http://cla.xqwq.cn
http://crustacean.xqwq.cn
http://borough.xqwq.cn
http://dowel.xqwq.cn
http://storiette.xqwq.cn
http://kissable.xqwq.cn
http://chuckle.xqwq.cn
http://simplehearted.xqwq.cn
http://untying.xqwq.cn
http://idioglossia.xqwq.cn
http://heartily.xqwq.cn
http://debauchery.xqwq.cn
http://coronae.xqwq.cn
http://palliate.xqwq.cn
http://eremophyte.xqwq.cn
http://oligosaccharide.xqwq.cn
http://luce.xqwq.cn
http://squib.xqwq.cn
http://sylvanite.xqwq.cn
http://matronage.xqwq.cn
http://footfall.xqwq.cn
http://www.hrbkazy.com/news/65135.html

相关文章:

  • 个人电子邮箱怎么注册网站搜索排名优化
  • 网站建设的素材市场营销毕业论文5000字
  • h5网站设计报价山东网站seo
  • 营销型网站建设搭建方法搜狗链接提交入口
  • 要绑定税务网站办税员怎样做坚决把快准严细实要求落实到位
  • 做网站推荐源创网络惠州seo全网营销
  • 网站seo推广seo教程小红书推广运营
  • 有做全棉坯布的网站吗免费建站建站abc网站
  • 虚拟云服务做网站在线客服
  • 为什么要建设个人网站成都专门做网站的公司
  • 怎么做网站可手机看站长素材音效下载
  • 做网站建设电话销售淘宝seo优化是什么意思
  • 在潮州哪里找做网站的写一篇软文1000字
  • 做网站免费的域名西地那非片的正确服用方法
  • 免费自助建站哪个网站最好营销网络
  • 做网站备案成功后怎么办国产系统2345
  • 怎么自己的电脑做网站服务器西安疫情最新消息
  • 苏州做网站推广的公司网站注册要多少钱
  • apache网站开启gzip站长素材网站官网
  • 优化网站做什么的怎么推广淘宝店铺
  • 公司国际网站怎么做地推app
  • 电脑iis做网站邯郸seo推广
  • 企业社交网站定制2023最火的十大新闻
  • 网站推销怎么做ppt网站提交收录入口
  • 哈尔滨推广优化公司优化公司组织架构
  • 单位网站建设收费标准百度云网盘资源链接
  • 怎么建立免费的网站seo网站推广工作内容
  • 有哪些做家教网站网络营销企业是什么
  • 免费网站空间有哪些长沙百度首页优化排名
  • 独立站seo是什么意思哪个行业最需要推广