1.定义
单例模式:保证一个类只有一个实例,并且提供一个访问它的全局访问点。
2.UML类图
3.代码实现
饿汉与懒汉的区别
前者在类装载时就实例化,后者只有在第一次被使用时才实例化。 (饿汉的优点是避免线程同步问题,缺点是即使没用到这个实例还是会加载) (懒汉的优点是实现了懒加载,但需要解决线程安全问题!)
1> 饿汉式,没有实现懒加载~
public class Singleton() {
private static Singleton instance = new Singleton();
private Singleton(){ }
public static Singleton getInstance() {
return instance;
}
}
//获取单例对象
Singleton mSingleton = Singleton.getInstance();
2> 懒汉,不加锁 线程非安全的
public class Singleton {
private static Singleton instance = null;
private Singleton() { }
private static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
3> 懒汉,加锁
public class Singleton {
private static Singleton instance = null;
private Singleton() { }
private static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
4> 静态内部类实现单例(推荐)
public class Singleton {
private Singleton() { }
private static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton()
}
}
5>容器类单例模式
public class SingletonManager {
private static Map<String,Object> objMap = new HashMap<String,Object>();
private Singleton(){ }
public static void registerService(String key,Object instance) {
if(!objMap.containsKey(key)) {
objMap.put(key,instance);
}
}
public static Object getService(String key) {
return objMap.get(key);
}
}
#include <iostream>
#include <string>
using namespace std;
class Singleton
{
private:
int i;
static Singleton *instance;
Singleton(int i)
{
this->i=i;
}
public:
static Singleton *getInstance()
{
return instance;
}
void show()
{
cout<<i<<endl;
}
};
Singleton* Singleton::instance=new Singleton(8899);
class A:public Singleton
{
};
int main()
{
Singleton *s=Singleton::getInstance();
Singleton *s2=A::getInstance();
cout<<(s==s2)<<endl;
return 0;
}