栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

1.什么式单列设计模式

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

1.1单列设计模式的优点

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

1.2单列设计模式的缺点

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

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

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

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

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

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

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

3.单例设计模式的分类 3.1饿汉式 3.1.1饿汉式的缺点:

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

3.1.2饿汉式的代码实现
#include 

using namespace std;

class Singleton{
    static Singleton *singleton;
    Singleton()
    {
        cout<<"这是一个无参构造"<show_info();
    Singleton *s2=Singleton::getinstence();
    s2->show_info();
    Singleton *s3=Singleton::getinstence();
    s3->show_info();

    return 0;
}
3.1.3结果图

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

3.2懒汉式 3.2.1缺点

3.2.2代码实现
#include 
#include 

using namespace std;
mutex mtx;

class Singleton{
    static Singleton* singleton;

    Singleton()
    {
        cout<<"这是一个无参构造"< lock(mtx);
        if(singleton==nullptr){
            singleton=new Singleton;
        }

        return singleton;
    }

    void show_info()
    {
        cout<show_info();
    Singleton *s2=Singleton::get_instence();
    s2->show_info();
    Singleton *s3=Singleton::get_instence();
    s3->show_info();

    Singleton::destroy();
    return 0;
}
3.2.3结果图和上面一样
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027129.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号