• C++常用设计模式:单例设计模式饿汉式和懒汉式详细说明


    1.什么式单列设计模式

    确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法

    1.1单列设计模式的优点

    单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。
    由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
    允许可变数目的实例。基于单例模式我们可以进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例,既节省系统资源,又解决了单例单例对象共享过多有损性能的问题

    1.2单列设计模式的缺点

    由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
    单例类的职责过重,在一定程度上违背了“单一职责原则”。

    因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起.
     

    2.单例模式的设计套路:

    1.即然外部不可以定义对象,也就是说是不可以从外部调到类的构造函数,所以就必须把构造函数私有 化, 但是私有化带来的问题是,在外部一个对象也定义不出来了。 所以必须在类内定义一个公开的接口,返回本类对象的指针。

     2.即使用public权限下定义一函数,返回出本类对象的指针。 但是,如果这个函数是一个普通函数的话,那么他还是依赖于类对象的调用才可以,这又与只产生一 个单例相矛盾了。 所以必须,把这个函数升级为静态函数。

    3.把这个函数升级为静态函数。 但是,升级为静态函数之后呢?函数就没有this指针,无法调取类中属性,所以也要把类中这个属性升 级为静态属性。

    4.把类中的本类的指针,升级为静态属性。

    3.单例设计模式的分类

    3.1饿汉式

    3.1.1饿汉式的缺点:

    当我不需要是他也已经构建好了,白白占有一块内存空间,对于C++精益求精的个性 来讲不合适。

    3.1.2饿汉式的代码实现

    1. #include
    2. using namespace std;
    3. class Singleton{
    4. static Singleton *singleton;
    5. Singleton()
    6. {
    7. cout<<"这是一个无参构造"<
    8. }
    9. ~Singleton()
    10. {
    11. cout<<"这是析构"<
    12. }
    13. public:
    14. static Singleton* getinstence()
    15. {
    16. return singleton;
    17. }
    18. void show_info()
    19. {
    20. cout<<this<
    21. }
    22. //将编译器自动提供的拷贝构造与等号运算符重载移除掉
    23. Singleton(const Singleton& other)=delete ;
    24. void operator=(const Singleton& other)=delete ;
    25. };
    26. Singleton* Singleton::singleton=new Singleton;
    27. int main()
    28. {
    29. Singleton *s1=Singleton::getinstence();
    30. s1->show_info();
    31. Singleton *s2=Singleton::getinstence();
    32. s2->show_info();
    33. Singleton *s3=Singleton::getinstence();
    34. s3->show_info();
    35. return 0;
    36. }

    3.1.3结果图

     说明定义的三个地址都是一样的,所以实现了单列设计模式。

    3.2懒汉式

    3.2.1缺点

    3.2.2代码实现

    1. #include
    2. #include
    3. using namespace std;
    4. mutex mtx;
    5. class Singleton{
    6. static Singleton* singleton;
    7. Singleton()
    8. {
    9. cout<<"这是一个无参构造"<
    10. }
    11. ~Singleton()
    12. {
    13. cout<<"这是析构"<
    14. }
    15. public:
    16. static Singleton* get_instence()
    17. {
    18. lock_guard lock(mtx);
    19. if(singleton==nullptr){
    20. singleton=new Singleton;
    21. }
    22. return singleton;
    23. }
    24. void show_info()
    25. {
    26. cout<<this<
    27. }
    28. static void destroy()
    29. {
    30. if(singleton!=nullptr){
    31. delete singleton;
    32. }
    33. }
    34. };
    35. Singleton* Singleton::singleton=nullptr;
    36. int main()
    37. {
    38. Singleton *s1=Singleton::get_instence();
    39. s1->show_info();
    40. Singleton *s2=Singleton::get_instence();
    41. s2->show_info();
    42. Singleton *s3=Singleton::get_instence();
    43. s3->show_info();
    44. Singleton::destroy();
    45. return 0;
    46. }

    3.2.3结果图和上面一样

  • 相关阅读:
    16-自动化测试——selenium介绍
    [项目管理-34]:项目经理在强矩阵与弱矩阵管理中不同的作用
    java毕业设计——基于java+MyBatis+jsp的网上招聘系统设计与实现(毕业论文+程序源码)——网上招聘系统
    【C++--类和对象】开篇
    笔试强训第25天--编程题--(树根+星际密码)
    optee4.0.0 qemu_v8的环境搭建篇(ubuntu20.10)
    农业信息学复习资料
    3分钟学会设计模式 -- 单例模式
    mssql ,数据库还原BAK命令行方式
    Radis高可用
  • 原文地址:https://blog.csdn.net/a2998658795/article/details/126002419