单例模式的饿汉和懒汉写法(基于C++)

这篇具有很好参考价值的文章主要介绍了单例模式的饿汉和懒汉写法(基于C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


单例模式

单例模式确保一个类只有一个实例,并提供全局访问点。这样可以避免在系统中出现多个相同的对象,从而提高系统的性能和可维护性。
单例模式的实现包括饿汉和懒汉,下面介绍C++中这两种方式的写法。

例程

饿汉

饿汉模式是在程序启动前创建实例。
下面是一个全局计数器的示例。
counter.h

class Counter
{
public:
    static void plus(int number);
    static void print();

private:    //method
    Counter();

private:    //member
    static Counter counter;
    int value { 0 };
};

counter.cpp

#include "counter.h"
#include <iostream>

using namespace std;

Counter::Counter()
{
    cout << "init Counter" << endl;
}

Counter *Counter::instance()
{
	return &counter;
}

void Counter::plus(int number)
{
    counter.value += number;
}

void Counter::print()
{
    cout << counter.value << endl;
}

调用

#include "counter.h"

int main()
{
    cout << "program run" << endl;
    Counter::plus(5);
    Counter::print();
    
    return 0;
}

单例模式的饿汉和懒汉写法(基于C++)

懒汉

懒汉模式是在第一次获取实例时调用。
同样是刚刚的例子。
counter.h

class Counter
{
public:
    static Counter* instance();
    void plus(int number);
    void print();

private:    //method
    Counter();

private:    //member
    int value{ 0 };
};

counter.cpp

#include "counter.h"
#include <iostream>

using namespace std;

Counter* Counter::instance()
{
    static Counter* counter = NULL;
    if (counter == NULL)
        counter = new Counter;
    return counter;
}

Counter::Counter()
{
    cout << "init Counter" << endl;
}

void Counter::plus(int number)
{
    value += number;
}

void Counter::print()
{
    cout << value << endl;
}

调用

#include "counter.h"

int main()
{
    cout << "program run" << endl;
    Counter::instance()->plus(5);
    Counter::instance()->print();
    
    return 0;
}

单例模式的饿汉和懒汉写法(基于C++)

对比

通过上面的例子我们可以看到,饿汉模式和懒汉模式有以下区别。

函数调用

Counter::plus(5);
Counter::print();

Counter::instance()->plus(5);
Counter::instance()->print();

懒汉需要经过实例化函数instance()才能调用方法,饿汉不需要,显然饿汉模式更方便客户端的使用,且效率更高。

线程安全

懒汉是获取实例时才实例化,存在一个线程安全的问题:主线程和子线程同时调用instance()。显然这是不安全的,所以如果这个单例是多线程共享的,还需要加锁。

为了解决懒汉的线程安全问题,可以对代码做以下修改,这里用的锁是Qt的互斥锁。

Counter* Counter::instance()
{
	static QMutex mutex;
    static Counter* counter = NULL;
    if (counter == NULL) {
		mutex.lock();
		if (counter == NULL)
			counter = new Counter;
		mutex.unlock();
	}
    return counter;
}

这里先判断counter == NULL再加锁是为了避免每次进来都加锁导致性能损耗,虽然增加了代码篇幅,但是增加的部分被执行的次数很少,所以对性能影响可以忽略不计。

总结

通过以上对比,一般来说饿汉会比懒汉要好一些,但如果需要加载的单例很多,耗时比较长,这时候可以考虑使用懒汉。文章来源地址https://www.toymoban.com/news/detail-438584.html

到了这里,关于单例模式的饿汉和懒汉写法(基于C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之单例模式(懒汉, 饿汉)

    单例模式是一种常用的软件设计模式, 该模式的主要目的是确保某一个类在内存中只能有一个实例对象, 通过单例模式的方法创建的类在当前进程中只有一个实例对象. 常见的单例模式有两种: 饿汉式, 这里的 “饿” 意义表述不够清晰, 用 “急” 来表述意义更加容易联想一些

    2024年02月22日
    浏览(49)
  • 单例模式(饿汉式单例 VS 懒汉式单例)

    所谓的单例模式就是保证某个类在程序中只有一个对象 1.构造方法私有化(保证对象的产生个数)         创建类的对象,要通过构造方法产生对象        构造方法若是public权限,对于类的外部,可以随意创建对象,无法控制对象个数       构造方法私有化,这样类的外

    2024年02月09日
    浏览(39)
  • 单例模式(懒汉式和饿汉式)

    单例模式是指保证某个类在整个软件系统中只有一个对象实例,并且该类仅提供一个返回其对象实例,由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。 在计算

    2024年02月13日
    浏览(47)
  • 单例模式:懒汉式和饿汉式

    目录 懒汉模式和饿汉模式 区别 示例 懒汉模式线程不安全 懒汉模式线程安全  懒汉模式内部静态变量线程安全 饿汉式线程安全 指的是在系统生命周期内,只产生一个实例。 分为 懒汉式 和 饿汉式 创建时机和线程安全 线程安全 :多线程共享资源的过程中,线程安全通过同

    2024年02月16日
    浏览(41)
  • JavaEE:单例模式(饿汉模式和懒汉模式)精讲

    前言 什么是单例模式? 其实用通俗的话就是程序猿约定俗成的一些东西,就比如如果你继承了一个抽象类,你就要重写里面的抽象方法,如果你实现了一个接口,你就要重写里面的方法。如果不进行重写,那么编译器就会报错。这其实就是一个规范。 而单例模式能保证某个

    2024年02月04日
    浏览(46)
  • 自学设计模式(类图、设计原则、单例模式 - 饿汉/懒汉)

    设计模式需要用到面向对象的三大特性——封装、继承、多态(同名函数具有不同的状态) UML类图 eg.—— 描述类之间的关系(设计程序之间画类图)  +: public; #: protected; -: private; 下划线: static 属性名:类型(=默认值) 方法和变量分开------- 虚函数斜体,纯虚函数在虚函数类

    2024年02月11日
    浏览(39)
  • 【多线程案例】单例模式(懒汉模式和饿汉模式)

    提起单例模式,就必须介绍设计模式,而设计模式就是在软件设计中,针对特殊问题提出的解决方案。它是多年来针对一些常见的问题的解决方法,具有良好的可复用性、可扩展性和可维护性。 标准的设计模式有23种,单例模式就是最常见的一种,其目的是确认一个类只有一

    2024年02月10日
    浏览(43)
  • 懒汉单例设计模式与饿汉单例设计模式

    单例模式即一个类确保只有一个对象,主要用于避免浪费内存 1 .饿汉单例设计模式 :拿到对象时,对象就早已经创建好了 写法: 把类的构造器私有 在类中自己创建一个对象,并赋值到一个变量 定义一个静态方法,返回自己创建的这个对象 2. 懒汉单例设计模式 :第一次拿到对象时

    2024年02月21日
    浏览(55)
  • 单例模式类设计|什么是饿汉模式和懒汉模式

    那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量干货博客汇总 https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482 一个类只能创建一个对象,

    2024年02月16日
    浏览(41)
  • 24种设计模式之单例模式(饿汉式、懒汉式)

    单例模式( Singleton Pattern )是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。单例模式在现实生活中应用也非常广泛,例如,总统,班主任等。J2EE标准中的ServletContext 、ServletContextConfig 等、Spring框架应用中的。 特点:构造方

    2024年02月07日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包