单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实体。即一个类只有一个对象实例。
懒汉式,也叫饱汉式,就是当需要(调用public函数)的时候再创建对象。
懒汉式C++实现:
//懒汉式
class Singleton
{
private:
Singleton(){};
static Singleton* p;
public:
static Singleton* getInstance();
};
Singleton* Singleton::p = NULL;
Singleton* Singleton::getInstance()
{
if(p == NULL)
p = new Singleton();
return p;
}
懒汉式Java实现:
//懒汉式
public class Singleton
{
private static Singleton p=null;
private Singleton(){}
public static Singleton getInstance(){
if(p==null){
p=new Singleton();
}
return p;
}
}
懒汉式 C++ 内部静态变量:
//懒汉式 内部静态变量
class Singleton
{
private:
Singleton(){};
public:
static Singleton* getInstance();
};
Singleton* Singleton::getInstance()
{
static Singleton p;
return &p;
}
懒汉式Java 静态内部类加载
//懒汉式 静态内部类加载
public class Singleton
{
private static class SingletonHolder
{
private static Singleton p=new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
懒汉式C++ 线程安全
//懒汉式 线程安全
class Singleton
{
private:
Singleton()
{
pthread_mutex_init(&mutex);
};
static Singleton* p;
public:
static pthread_mutex_t mutex;
static Singleton* getInstance();
};
Singleton* Singleton::p = NULL;
pthread_mutex_t Singleton::mutex;
Singleton* Singleton::getInstance()
{
if(p == NULL)//多线程性能优化
{
pthread_mutex_lock(&mutex);
if(p == NULL)
p = new Singleton();
pthread_mutex_unlock(&mutex);
}
return p;
}
懒汉式Java 线程安全
//懒汉式 线程安全
public class Singleton
{
private static Singleton p=null;
private Singleton(){}
public static Singleton getInstance(){
if(p==null){
synchronized (Singleton.class){
if(p==null){
p=new Singleton();
}
}
}
return p;
}
}
饿汉式 就是不管你什么时候要,在单例类定义的时候就创建出实例对象。
饿汉式C++实现:
//饿汉式
class Singleton
{
private:
Singleton(){};
static Singleton* p;
public:
static Singleton* getInstance();
};
Singleton* Singleton::p = new Singleton();
Singleton* Singleton::getInstance()
{
return p;
}
饿汉式Java实现:
//饿汉式
public class Singleton
{
private static final Singleton p= new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return p;
}
}