8种 单例设计模式

目录
单例模式的优点:
一、饿汉式(静态属性)
二、饿汉式(静态代码块)
三、懒汉式(线程不安全)
四、懒汉式(线程安全,同步方法)
五、懒汉式(线程安全,同步代码块)
六、双重检查
七、静态内部类
八、枚举
设计模式("套路")是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式 。设计模式免去我们自己再思考和摸索 。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法 。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象 。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的 。
单例模式主要分为饿汉式和懒汉式:
饿汉式:(创建时就已经存在对象)
坏处:对象加载时间过长 。
好处:饿汉式是线程安全的 。
懒汉式:
好处:延迟对象的创建
单例模式的优点:
由于单例模式值生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依靠对象时,则可以用过在应用启动时直接产生一个单例对象,然后永远驻留内存的方式来解决 。
一、饿汉式(静态属性)
步骤如下:
构造器私有化 (防止 new ) 。
类的内部创建对象 。
向外暴露一个静态的公共方法 。
public class SingletonMode01 {//1.构造器私有化 (防止在类的外部产生类的对象)private SingletonMode01(){}//2.类的内部创建对象(静态属性)private static SingletonMode01 instance = new SingletonMode01();//3.向外暴露一个静态的公共方法 。getInstancepublic static SingletonMode01 getInstance(){return instance;}}
优缺点:
优点:这种写法比较简单,就是在类装载的时候就完成实例化 。避免了线程同步问题 。
缺点:在类装载的时候就完成实例化,没有达到Lazy 的效果 。如果从始至终从未使用过这个实例,则会造成内存的浪费 。
这种单例模式可用,可能造成内存浪费
是线程安全的
类加载的时候执行
JVM 保证了类加载的过程是线程安全的
二、饿汉式(静态代码块)
步骤如下:
与1相同就是对静态常量赋值时在静态代码块中执行
public class SingletonMode02 {//1.构造器私有化 (防止 new )private SingletonMode02(){}//2.类的内部创建对象(静态常量)private static SingletonMode02 instance;//在静态代码中对静态常量赋值static{instance = new SingletonMode02();}//3.向外暴露一个静态的公共方法 。getInstancepublic static SingletonMode02 getInstance(){return instance;}}
优缺点:
这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例 。优缺点和上面是一样的 。
这种单例模式可用,但是可能造成内存浪费
三、懒汉式(线程不安全)
public class SingletonMode03 {private static SingletonMode03 instance = null;private SingletonMode03(){}//当调用getInstance才创建单例对象,饿汉式public static SingletonMode03 getInstance(){if(instance == null){instance = new SingletonMode03();//只在第一次的时候执行}return instance;}}