创建单例的几种方式

来源:互联网 发布:班服短袖淘宝 编辑:程序博客网 时间:2024/05/19 07:28
class Singleton1{   //双重锁
    private static Singleton1 singleton;
    private Singleton1() {}
    public static Singleton1 getInstance() {
        if (singleton==null) {
            synchronized (Singleton1.class) {
                if (singleton==null) {
                    singleton=new Singleton1();
                }
            }
        }
        return singleton;
    }
}
class Singleton2{ //饿汉模式
    private static Singleton2 singleton=new Singleton2();
    private Singleton2() {}
    public static Singleton2 getInstance(){
        return singleton;
    }
}
class Singleton3{ //懒汉模式
    private static Singleton3 singleton;
    private Singleton3(){}
    public static Singleton3 getInstance(){
        if (singleton==null) {
            singleton=new Singleton3();
        }
        return singleton;
    }
}
enum Singleton4{ //枚举
    INSTANCE;
    public void method(){
        System.out.println("枚举");
    }
}

class Singleton5{ //静态内部类
    private static class SingletonHolder{
        private final static Singleton5 singleton=new Singleton5();
    }
    private Singleton5(){}
    public static Singleton5 getInstance(){
        return SingletonHolder.singleton;
    }
}
class Singleton6{  //登记模式 可以继承的单例
    private static HashMap<String, Singleton6> registry;
    private static final String KEY_STRING="SINGLETONKEY";
    static{
        
        Singleton6 singleton=new Singleton6();
        registry.put("SINGLETONKEY", singleton);
        
    }
    protected Singleton6(){}
    public static Singleton6 getInstacne(String key){
        if (key==null) {
            key=KEY_STRING;
        }
        if(registry.get(key)==null){
            try {
                registry.put(key, (Singleton6) Class.forName(key).newInstance());
            } catch (InstantiationException | IllegalAccessException
                    | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return registry.get(key);
    }
}
class Singleton6Child extends Singleton6{
    protected Singleton6Child(){
        
    }
    public static Singleton6Child getInstacne(){
        return (Singleton6Child) Singleton6.getInstacne(null);
    }
}
0 0
原创粉丝点击