码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2019-04-06 00:04:14      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:懒汉模式   返回   单例   int   span   public   zed   vol   volatil   

1.在阅读Android源代码的时候会发现,对于一个简单的问题,这些代码也设计的非常复杂,有各种类和各种嵌套,这些代码看起来一点都不直观,为的是让代码更加容易扩展,引入和很多设计模式。当理解了这些设计模式后再去看Android源代码就不会感觉那么复杂了。

2.单例模式:在一个进程(包括一个进程的多个线程中),一个类只有一个实例化对象。

3.为了防止使用的人不使用getInstance()获取单例对象,而是直接new或直接定义对象或直接使用g_singleton指针,可以把Singleton对象的构造函数设置为private的,把g_singleton设置成private的。

4.限制:Singleton不可被继承,因为其构造函数是private的。

5.单例模式实现方式
(1)懒汉模式:用到时迫不得已才生成

/*------C++实现--------*/
#include <iostream>

using namespace std;

class Singleton {
private:
    Singleton() { cout << "Singleton()" << endl; } /*构造函数是私有的*/
    static Singleton *g_singleton;
    static pthread_mutex_t mutex;
public:
    static Singleton* getInstance();
};

pthread_mutex_t Singleton::mutex = PTHREAD_MUTEX_INITIALIZER;
Singleton *Singleton::g_singleton = NULL;

Singleton* Singleton::getInstance() {
    if (g_singleton == NULL) {    //double check,提高效率
        pthread_mutex_lock(&mutex);
        if (g_singleton == NULL) {
            g_singleton = new Singleton(); //有没有()都是可以的。
        }
        pthread_mutex_unlock(&mutex);
    }
    return g_singleton;
}

int main() {

    Singleton *s1 = Singleton::getInstance();
    cout << s1 << endl;
    Singleton *s2 = Singleton::getInstance();
    cout << s1 << endl;
    Singleton *s3 = Singleton::getInstance();
    cout << s1 << endl;

    return 0;
}
/*------Java实现--------*/
public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
        if (singleton == null) {  
            synchronized (Singleton.class) {  
                if (singleton == null) {  
                    singleton = new Singleton();  
                }  
            }  
        }  
        return singleton;
    }  
}

 

(2)饿汉模式:很饿很急,一开始就实例化好
C++: SingleTon *SingleTon::gInstance = new SingleTon; 定义的时候就生成。
SingleTon::getInstance()中直接返回这个对象即可,此时就不需要锁了!

/*------C++实现--------*/
#include <iostream>

using namespace std;

class Singleton {
private:
    Singleton() { cout << "Singleton()" << endl; }
    static Singleton *g_singleton;
public:
    static Singleton* getInstance();
};

Singleton *Singleton::g_singleton = new Singleton();
Singleton* Singleton::getInstance() {
    return g_singleton;
}

int main() {

    Singleton *s1 = Singleton::getInstance();
    cout << s1 << endl;
    Singleton *s2 = Singleton::getInstance();
    cout << s1 << endl;
    Singleton *s3 = Singleton::getInstance();
    cout << s1 << endl;

    AA a1;

    return 0;
}
/*------Java实现--------*/
public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton (){}
    public static Singleton getInstance() {
        return instance;
    }
}

 

 

 

 

参考:http://www.runoob.com/design-pattern/singleton-pattern.html

 

单例模式

标签:懒汉模式   返回   单例   int   span   public   zed   vol   volatil   

原文地址:https://www.cnblogs.com/hellokitty2/p/10660462.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!