iOS设计模式之单例模式

iOS 开发中单例随处可见,从开发者接触最多的 UIApplication 到 NSNotificationCenter, 再到 NSFileManager 单例模式的应用十分广泛,楼主开发 iOS至今也经常用到单例这种设计模式,今天看 java 同事讲到懒汉式单例,感觉有点新颖(小编半路出家搞 iOS,基础很差),然后百度了下才知道了有饿汉模式和懒汉模式.楼主看了下自己写的代码,然后才知道自己一直用的懒汉模式,这要是去面试人家懒汉模式啥的 ,小遍瞬间不明觉厉,毕竟没有系统的学过计算机专业课程.

这是楼主经常使用到的单例写法 其实就是使用的时候才会被初始化,类似于懒加载这种模式 缺点是如果多个线程访问会出现线程问题 ,如果处理的不好就不能保证全局只能有一个实例对象, 所以又要用synchronized关键字来做限制.

image.png

而饿汉模式又是什么呢, 通过百度才知道 原来应用已启动就去创建一个单例对象,不管你用有没有用的这个实例,都给你创建出来了. 这种模式好处是不会遇到使用使用去创建,避免了多线程同时访问时候出现问题,但是缺点是就像一个饿汉 还么有开始干活了老想着去吃饭 .

终于明白了小编用的是懒汉模式去实现单例的.
下边是小编用 C++ 写的懒汉和饿汉两张模式实现单例这种设计模式.


懒汉模式实现单例
class Singelton {

private:
    Singelton() {
        cout<< "Singelton 构造函数执行" <<endl;
    }

public:
    static Singelton * getInstance() {
        if (_singelton == NULL) {
            _singelton = new Singelton;
        }
        return _singelton;
    }

    static void FreeIstance() {
        if (_singelton != NULL) {
            delete _singelton;
            _singelton = NULL;
        }
    }

 private:
    static Singelton *_singelton;

};

Singelton *Singelton::_singelton = NULL;

int main()
{

    Singelton *s1 = Singelton::getInstance();
    Singelton *s2 = Singelton::getInstance();

    printf("s1 = %p s2 = %p\n",s1,s2);

    if (s1 == s2) {
        cout<<"s1 和 s2是同一个实例对象"<<endl;
    } else {
        cout<<"s1 和 s2是两个不同的实例对象"<<endl;
    }
    Singelton::FreeIstance();

    Singelton *s3 = Singelton::getInstance();
    printf("s3 = %p\n",s3);

    return 0;
}
饿汉模式单例
class Singelton {

private:
    Singelton() {
        cout<< "Singelton 构造函数执行" <<endl;
    }

public:
    static Singelton * getInstance() {
        return _singelton;
    }

    static void FreeIstance() {
        if (_singelton != NULL) {
            delete _singelton;
            _singelton = NULL;
        }
    }

 private:
    static Singelton *_singelton;

};

Singelton *Singelton::_singelton = new Singelton;

int main()
{

    Singelton *s1 = Singelton::getInstance();
    Singelton *s2 = Singelton::getInstance();

    printf("s1 = %p s2 = %p\n",s1,s2);

    if (s1 == s2) {
        cout<<"s1 和 s2是同一个实例对象"<<endl;
    } else {
        cout<<"s1 和 s2是两个不同的实例对象"<<endl;
    }
    Singelton::FreeIstance();

    Singelton *s3 = Singelton::getInstance();
    printf("s3 = %p\n",s3);

    return 0;
}

两者区别:饿汉模式加载慢执行快,安全性高。饿汉模式加载快执行慢,有线程安全问题。想想,只能实例化一次的东西,还在被调用时才实例化,遇到多线程时一定会有问题的。

好了,我是大兵布莱恩特,欢迎加入博主技术交流群,iOS 开发交流群

QQ20180712-0.png

猜你喜欢

转载自blog.csdn.net/dzb1060545231/article/details/80684252
今日推荐