美文网首页
一文搞懂单例模式

一文搞懂单例模式

作者: 小雨启明 | 来源:发表于2019-02-22 22:43 被阅读0次

一、 预备知识 首先解决一个问题“如何访问私有静态成员变量”

  1. 定义并初始化私有静态成员变量x
#include<iostream>
using namespace std;
class A{
private:
    static int x;
}
int A::x = 1;
  1. 在main函数中通过类来直接访问会出错
#include<iostream>
using namespace std;
class A{
private:
    static int x;
};
int A::x = 1;
void main(){
    cout << A::x;
    return;
}

error C2248: “A::x”: 无法访问private 成员(在“A”类中声明)

  1. 只能通过公有函数来访问
#include<iostream>
using namespace std;
class A{
private:
    static int x;
public:
    int getx(){
        return xx;
    }
};
int A::x = 1;
void main(){
    A a;
    cout << a.getx();
    return;
}

二 单例模式
单例模式的动机是让类自身负责保存它的唯一实例,这个类可以保证没有其他实例被

创建,并且它提供一个访问该实例的方法。

解决方法:1、类的定义中含有一个该类的静态私有对象;
静态对象属于类,由类保存。
私有化的意义在于只能通过接口去访问,否则在饱汉模式下会出现对象为空的现象。如

#include<iostream>
using namespace std;
class Singleton{
private:
    Singleton(){};   
public:
    static Singleton *single; 
public:
    static Singleton *GetSingleton(){
    if(single == NULL){
        single = new Singleton;
    }
    return single;
    }
};
Singleton* Singleton::single = NULL;
void main(){
    Singleton *s2 = Singleton::single;
    Singleton *s1 = Singleton::GetSingleton();
    
    if(s1 == s2){
        cout<<"yes"<<endl;
    }else{
        cout<<"NO"<<endl; 
    }
}

其中s2为NULL;
2、私有化构造函数;
3、提供一个静态的公有函数用于创建或获取自身的静态私有对象。
如果不是这样,就需要实例化对象来调用函数进行这些操作,用一个对象去获取另一个唯一的对象 明显是搞笑的。 见章节一。

三 多种实现方式
1、 饱汉模式

#include<iostream>
using namespace std;
class Singleton{
private:
    Singleton(){};   //私有化构造函数
    static Singleton *single; //私有静态对象
public:
    static Singleton *GetSingleton(){ //公有静态返回函数
    if(single == NULL){
        single = new Singleton;
    }
    return single;
    }
};

Singleton* Singleton::single = NULL;

2、 线程安全懒汉模式

#include<iostream>
using namespace std;
class Singleton{
private:
    Singleton(){};   
public:
    static Singleton *single; 
public:
    static Singleton *GetSingleton(){
    if(single == NULL){                      //注意是双重判断 防止每次访问都有加锁
        lock();
            if(single == NULL)
                single = new Singleton;
        unlock();
    }
    return single;
    }
};
Singleton* Singleton::single = NULL;

3、 饿汉模式

#include<iostream>
using namespace std;

class Singleton{
private:
    Singleton(){};
    static Singleton* single;
public:
    static Singleton* get(){
        return single;
    }
};
Singleton* Singleton::single = new Singleton();

相关文章

  • 一文搞懂单例模式

    一、 预备知识 首先解决一个问题“如何访问私有静态成员变量” 定义并初始化私有静态成员变量x 在main函数中...

  • Vue 单页应用(spa)前端路由实现原理

    一文搞懂单页应用原理Vue项目History模式路由机制 源码分析VueVueRouter Vue 单页应用(sp...

  • 搞懂设计模式-单例模式

    设计模式-单例模式 单例模式在网上已经是被写烂的一种设计模式了,笔者也看了不少的有关单例模式的文章,但是在实际生产...

  • 深入理解 Java 内存模型

    一、概述 在之前 单例模式的Java实现与思考 一文里讲到,为了使用 DCL 实现线程安全的单例模式,需要对实例变...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • Telegram开源项目之单例模式

    NotificationCenter的单例模式 NotificationCenter的单例模式分析 这种单例模式是...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

网友评论

      本文标题:一文搞懂单例模式

      本文链接:https://www.haomeiwen.com/subject/klgyyqtx.html