Java的登记式单例代码

来源:互联网 发布:买个淘宝皇冠店多少钱 编辑:程序博客网 时间:2024/04/28 07:09

网上很多关于登记式单例的代码,有的是错误的,有的过于繁杂,因此自己写了一个代码例子,供大家参考。
参考了并补全了https://github.com/simple-android-framework-exchange/android_design_patterns_analysis/tree/master/singleton/mr.simple
中的内容。

package com.dumaisoft.singleton;import java.util.HashMap;/** * @author wxb * Description:登记式单例,将需要单例的类都登记在一个Manager中,需要时调取 *          在Android系统中,我们经常会通过Context获取系统级别的服务,比如WindowsManagerService,  *          ActivityManagerService等,更常用的是一个叫LayoutInflater的类。这些服务会在合适的时候以单例的形式注册在系统中, *          在我们需要的时候就通过Context的getSystemService(String name)获取。 *          这些服务就是使用了登记式单例的模式。 * * 2016-1-24 * 下午9:33:21 */public class TestSingleton5 {    public static void main(String[] args) {        Singleton_1 s1 = (Singleton_1) SingletonManager.getSingleton(Singleton_1.class.getName());        s1.doSomething();        Singleton_2 s2 = (Singleton_2) SingletonManager.getSingleton(Singleton_2.class.getName());        s2.doSomething();        Singleton_3 s3 = (Singleton_3) SingletonManager.getSingleton(Singleton_3.class.getName());        s3.doSomething();    }}class SingletonManager {    private final static HashMap<String, Object> map = new HashMap<String, Object>();    //在静态域中直接注册本系统所需的所有单例类    static {        registeSingleton(Singleton_1.class.getName(),new Singleton_1());        registeSingleton(Singleton_2.class.getName(),new Singleton_2());        registeSingleton(Singleton_3.class.getName(),new Singleton_3());    }    public static void registeSingleton(String name, Object singleton) {        if (!map.containsKey(name)) {            map.put(name, singleton);        }    }    public static void unregisteSingleton(String name) {        if (map.containsKey(name)) {            map.remove(name);        }    }    public static Object getSingleton(String name) {        if (map.containsKey(name)) {            return map.get(name);        } else {            return null;        }    }}class Singleton_1 {    public void doSomething() {        System.out.println(this.getClass().getName() + " do sth.");    }}class Singleton_2 {    public void doSomething() {        System.out.println(this.getClass().getName() + " do sth.");    }}class Singleton_3 {    public void doSomething() {        System.out.println(this.getClass().getName() + " do sth.");    }}
0 0