TypechoJoeTheme

IT技术分享

统计

单例模式——23种设计模式之创建型模式

2015-06-27
/
0 评论
/
643 阅读
/
正在检测是否收录...
06/27

单例指类只需要一个实例,单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。以下是七种单例模式的书写方式。

一、懒汉(线程不安全)

//优点:可以lazy加载,缺点:线程不安全

public Class Singleton{

    public static Singleton instance =null;

    private Singleton(){}

    public static Singleton getInstance(){

        if(instance == null){

            instance = new Singleton();

        }

        return instance;

    }

}

二、懒汉(线程安全)

//优点:线程安全,缺点:耗资源

public Class Singleton{

    public static Singleton instance =null;

    private Singleton(){}

    public static synchronized Singleton getInstance(){

        if(instance == null){

            instance = new Singleton();

        }

        return instance;

    }

}

三、饿汉

//优点:避免了多线程同步问题,缺点:没有Lazy加载

public Class Singleton{

    public static Singleton instance =new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){

        return instance;

    }

}

四、饿汉(变种)

//和第三种差不多

public Class Singleton{

    public static Singleton instance =null;

    static{

        instance = new Singleton();

    }

    private Singleton(){}

    public static  Singleton getInstance(){

        return instance;

    }

}

五、静态内部类

//避免了多线程同步问题,也实现了Lazy加载

public Class Singleton{

    private static Class SingletonHolder{

        private static final Singleton INSTANCE = new Singleton();

    }

    private Singleton(){}

    public static final Singleton getInstance(){

        return SingletonHolder.INSTANCE;

    }

    /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */

    public Object readResolve{

        return getInstance();

    }

}

六、枚举

//这是Effective Java作者Josh Bloch 提倡的方式,

//不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象

public enum Singleton{

    INSTANCE;

    public void whateverMethod(){}

}

七、双重校验锁

//对第二种方式的升级,优点:线程安全,不耗资源

public Class Singleton{

    public static volatile Singleton instance =null;

    private Singleton(){}

    public static Singleton getInstance(){

        if(instance == null){

            synchronized(Singleton.class){

                if(instance == null){

                    instance = new Singleton();

                }

            }

        }

        return instance;

    }

}

总结

采用类的静态方法,也可以实现单例模式的效果。但是存在以下问题

1、静态类不能实现接口。因为接口中不允许有static修饰的方法,所以即使实现了也是非静态的。

2、单例可以实现延迟初始化,静态类一般第一次加载时就初始化了。

3、单例类可以被继承,方法可以被覆写。但是静态类的内部方法都是static,无法被覆写。

朗读
赞 · 0
版权属于:

IT技术分享

本文链接:

https://idunso.com/archives/401/(转载时请注明本文出处及文章链接)