设计模式学习 — 单例模式

单例模式

对于一个东西在整个系统,全局上只有一个,比如电脑的任务管理器,无论你按多少次Ctrl + Alt + Del都会只打开同一个窗口。

将任务管理抽象为一个类的话,单例模式也就是一个类全局只有一个实例,这个类要提供一个全局的访问点。

单例模式可以控制类实例的数目,节省系统资源。能避免一个全局使用的类频繁被创建和销毁带来的开销。

单例模式实现步骤

1、构造私有化,使类不能实例化
2、增加静态私有的当前类的指针
3、提供静态的对外接口,可以让用户得到单例对象

两种不同实现方式的单例模式

1、懒汉式

需要对象的时候才创建

class SingletonPattern
{
private:
    SingletonPattern();
    static SingletonPattern *sp;

public:
    void showName(void);
    static SingletonPattern *getInstance();   //由于构造私有,类不能被实例化,所以提供全局访问的函数必须是静态函数,通过类名就可以访问
};

SingletonPattern *SingletonPattern::sp = NULL;

SingletonPattern::SingletonPattern()
{
}

SingletonPattern *SingletonPattern::getInstance()
{
    if (sp == NULL)
        sp = new SingletonPattern;   //需要时才创建
    return sp;
}

void SingletonPattern::showName(void)
{
    cout << "单例模式" << endl;
}

懒汉式在多线程情况下是不安全的,当两个线程都试图获得单例对象时,所以的单例模式就不存在了。在多线程下使用懒汉式就要加锁。

2、饿汉式

类创建时就已经在类外初始化创建好单例对象。

class SingletonPattern
{
private:
    SingletonPattern();
    static SingletonPattern *sp;

public:
    void showName(void);
    static SingletonPattern *getInstance();
};

SingletonPattern *SingletonPattern::sp = new SingletonPattern;//类创建时就已经创建好单例对象

SingletonPattern::SingletonPattern()
{
}
SingletonPattern *SingletonPattern::getInstance()
{
    return sp;
}

void SingletonPattern::showName(void)
{
    cout << "单例模式" << endl;
}

饿汉式在多线程下是安全的,单例对象在线程执行前就已经创建好了,全局只有一个,调用函数获取单例对象也只有一个。

单例模式对象释放的问题

因为单例模式对象全局只有一个,对象在堆区创建,程序运行结束系统会自动释放回收,所以不需要手动释放。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值