• java单例模式实例


    什么是单例模式?

    定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例场景,也就是说:确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象应该有且只有一个。

    UML类图:

    构建单例模式的关键:

    1.构造函数不对外开放,一般为Private

    2.通过一个静态方法或者枚举返回单例类对象

    3.确保单例类的对象有且只有一个,尤其是多线程的环境下

    4.确保单例类对象在反序列化时不会重新构建对象

    单例模式构建方式:

    1.饿汉模式

    2.懒汉模式(Double Check)

    3.静态内部类的单利模式

    4.枚举单例模式

    5.容器实现单例模式

    代码示例:

    1.饿汉模式

    [java]
    1. public class Singleton {  
    2.     private Singleton(){  
    3.     }  
    4.     private static final Singleton Instance=new Singleton();  
    5.     public Singleton getInstance(){   
    6.         return Instance;  
    7.     }  
    8. }  

    2. 懒汉模式(Double Check)

    [java]
    1. public class Singleton {  
    2.     private Singleton(){  
    3.     }  
    4.     private static Singleton Instance=null;  
    5.     public Singleton getInstance(){   
    6.         if(Instance==null){  
    7.             synchronized (Singleton.class) {  
    8.                 if(Instance==null)  
    9.                 {  
    10.                     Instance=new Singleton();  
    11.                     return Instance;  
    12.                 }  
    13.             }  
    14.         }  
    15.         return Instance;  
    16.     }  
    17. }  

    3.静态内部类单例模式

    [java]
    1. public class Singleton {  
    2.     private Singleton(){}  
    3.     private static Singleton getInstance(){  
    4.         return SingletonHolder.Instance;  
    5.     }  
    6.     /** 
    7.      * 静态内部类 
    8.      */  
    9.     private static class SingletonHolder{  
    10.         private static final Singleton Instance = new Singleton();  
    11.     }  
    12. }  


    当第一次加载Singleton类时,并不会初始化Instance,只有在第一次调用Singleton的getInstance方法时,才会导致 Instance 被初始化。第一次调用 getInstance 方法会导致虚拟机加载SingletonHolder类,这种方式不仅能够确保线程安全,也能够保证单例对象的唯一性,同时也延迟了单例对象的实例化,所以推荐使用这种方法。
    4.枚举单例

    [java]
    1. public enum SingletonEnum{  
    2.       INSTANCE;  
    3.       public void doSomething(){  
    4.             System.out.println("do sth.");  
    5.       }  
    6. }  


    5.使用容器实现单例模式

    [java]
    1. public class SingletonManager {  
    2.     private static Map<String, Object> objMap = new HashMap<String, Object>();  
    3.     private SingletonManager(){ }  
    4.     //将多种单例类型注入到一个统一的管理类,在使用时根据key获取对象对应类型的对象  
    5.     public static void registerService(String key, Object instance)  
    6.     {  
    7.         if(!objMap.containsKey(key)){  
    8.             objMap.put(key, instance);  
    9.         }  
    10.     }  
    11.     public static Object getService(String key){  
    12.         return objMap.get(key);  
    13.     }  
    14. }  

    这种容器单例模式的实现,在Android中,我们使用的Context的getSystemService(key)的方式,就是利用的容器单例模式。eg:WIndowsManagerService、ActivityManagerService等等。在虚拟机第一次加载该类时,会注册各种Service,这些服务以键值对的形式存储在一个HashMap中,用户使用时只需要根据key来获取到对应的具体服务对象了。

  • 相关阅读:
    结构体后面不加 ; 的后果。
    swap的两种错误写法
    rewind和fseek作用分析
    16个get函数的用法。
    枚举的简单使用。
    小知识点
    网线头的做法
    内存和寄存器
    linux下service mongod start启动报错
    appium上下文切换、webview调试以及chromedriver/键盘等报错问题解决
  • 原文地址:https://www.cnblogs.com/interdrp/p/8045834.html
Copyright © 2020-2023  润新知