单例模式--- 声明周期托管方式

声明周期托管方式,IOC

JAVA代码

MyManager.java

import java.util.HashMap;

/**
 * 为了管理对象的产生
 * 对象的控制权给当前类负责
 * 生命周期托管实现对象的单例
 * IOC控制反转
 */
public class MyManager {
    // 存储所有被管理的对象
    private static HashMap<String, Object> beanMap = new HashMap<>();

    // 获取任何类的一个对象
    // className : 类名
    // return: (泛型T)
    public static <T> T getBean(String className) {
        T obj = null;
        try {
            // 去beanBox看有没有存在了
            obj = (T) beanMap.get(className);
            if (obj == null) {
                // 1. 通过类名获取类
                Class clazz = Class.forName(className);
                // 2. 通过反射产生一个对象
                obj = (T) clazz.newInstance();
                // 3. 加入集合
                beanMap.put(className, obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }
}

Sign.java

// 单例模式 IOC
// 生命周期给别人托管
class Sign {
    public Sign() {
        System.out.println("创建了一个实例");
    }
}

Demo.java

public class Demo {

    public static void main(String[] args) {
        // 获取一个实例
        Sign instance1 = MyManager.getBean("Sign");
        // 再获取一个实例  ;注意,构造函数也只是执行了一次,所以引用一个对象
        Sign instance2 = MyManager.getBean("Sign");

        System.out.println(instance1);
        System.out.println(instance2);
        if (instance1 == instance2) {
            System.out.println("引用了同一个实例");
        } else {
            System.out.println("不是同一个实例");
        }
    }

}

执行结果:

 

posted @ 2019-09-04 22:59  jadeshu  阅读(294)  评论(0编辑  收藏  举报