作者:黎芝君1_530 | 来源:互联网 | 2023-06-06 23:42
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 objMap = new HashMap(); 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
#include
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<};
Singleton* Singleton::instance=new Singleton(8899); class A:public Singleton
{};int main()
{Singleton *s=Singleton::getInstance();Singleton *s2=A::getInstance();cout<<(s==s2)<}