单例设计模式理解
2020-05-25 本文已影响0人
盐海里的鱼
单例:即只返回同一个构建对象的一种设计模式
1.最常见的单例:这是一种线程不安全的单例
//单例模式 线程不安全 可能产生不同的单例实例
class Signle1{
private static Signle1 mInstance;
private Signle1(){}
public static Signle1 getInstance(){
if(mInstance==null){
try {
Thread.sleep(getRandom());
} catch (InterruptedException e) {
e.printStackTrace();
}
mInstance = new Signle1();
}
return mInstance;
}
public static long getRandom(){
Random random = new Random();
int max = 1000;
int min =100;
return random.nextInt(max)%(max-min+1)+min;
}
}
![](https://img.haomeiwen.com/i11566261/78b302aa1deac1be.png)
2.饿汉式单例:
//饿汉式 单例模式 线程安全 适用场景 开销小 运行就需要创建时使用
class Single2{
public static Single2 sInstance =new Single2();
private Single2(){}
public static Single2 getInstance(){
try {
Thread.sleep(getRandom());
} catch (InterruptedException e) {
e.printStackTrace();
}
return sInstance;
}
public static long getRandom(){
Random random = new Random();
int max = 1000;
int min =100;
return random.nextInt(max)%(max-min+1)+min;
}
}
![](https://img.haomeiwen.com/i11566261/68812a92ca5c8ec9.png)
3.懒汉式单例: 可以在用到时再加载单例对象
//饿汉式 线程安全
class Single3{
//volatile 防止指令重排 使双重检查不失效
private volatile static Single3 mInstance;
private Single3(){}
//锁住的资源太大
// public synchronized static Single3 getInstance(){
// if(mInstance==null)
// mInstance = new Single3();
// return mInstance;
// }
//采用DCL 双重校验
public static Single3 getInstance(){
if(mInstance==null){
synchronized (Single3.class){
if(mInstance==null){
mInstance = new Single3();
}
}
}
return mInstance;
}
}
![](https://img.haomeiwen.com/i11566261/98a9aa79318b342f.png)
![](https://img.haomeiwen.com/i11566261/8bc2f9626670da3f.png)
4.静态内部类单例:优点延迟加载
class Single4{
private Single4(){}
static class SigleHandler{
public static Single4 INSTANCE= new Single4();
}
public static Single4 getInstance(){
return Single4.SigleHandler.INSTANCE;
}
}
![](https://img.haomeiwen.com/i11566261/0d10038d8410c8a9.png)
5.枚举构建单例:枚举本身就是线程安全的
//枚举单例
class Single5{
private Single5(){}
public enum SingelDealer{
SINGEL_DEALER;
private Single5 single5;
private SingelDealer(){
single5 = new Single5();
}
public Single5 getSingle5(){
return single5;
}
}
public static Single5 getInstance(){
return SingelDealer.SINGEL_DEALER.getSingle5();
}
}
![](https://img.haomeiwen.com/i11566261/256e255f8d04f094.png)
6.容器单例:
//容器单例 安卓常用 getSystemService(NOTIFICATION_SERVICE)就是用这种模式
class Single6{
private static HashMap<String,Object> mServiceList = new HashMap<>();
public static void registerService(String key,Object service){
if(!mServiceList.containsKey(key)){
mServiceList.put(key,service);
}
}
public static Object getService(String key){
return mServiceList.get(key);
}
}