设计模式-单例模式

原创
2019/04/01 22:13
阅读数 80

一、什么是单例模式

      单例模式,顾名思义就是一个类只有一个实例的模式,是所有设计模式当中最为简单的一种设计模式。有些类对象我们只需要一个实例。例如线程池、缓存、注册表、日志对象等。事实上,这类对象只能有一个实例,如果有多个实例会产生程序的异常。

 

二、单例模式实现

2.1 实现思路

     但凡是一个公开的类,就可以通过new ClassName()的方法实例化对象。那我们通过什么办法做到只能实例化一个对象?显然不是通过程序员之间的约定就能办到的。那应该怎么办?

      1.将类的构造方法定义成私有方法。

      2.类内部进行实例化。

      3.通过静态方法将实例返回。

2.2 UML图

2.3代码演示

2.3.1懒汉模式

public class Singleton {
    private static Singleton instance;
    private Singleton(){
        System.out.print("Singleton created");
    }
    public static Singleton getInstance(){
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

      上面的代码已经可以基本满足单例模式了,但是在多线程环境中上面的代码还是有可能构造多个实例对象。这时候我们只需要把getInstance方法改成同步方法(sychronized)就可以轻易解决多线程的问题。

2.3.2 同步懒汉模式

public class Singleton {
    private static Singleton instance;
    private Singleton(){
        System.out.print("Singleton created");
    }
    public static sychronized Singleton getInstance(){
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

      上面的方法确实是解决了多线程的问题,但是你要知道执行一个同步方法可能造成程序执行效率降低100倍。如果应用程序总是创建并使用单例实例,或者创建和运行时负担不重,你可以使用“急切”创建实例的方法,即懒汉模式。

2.3.3 饿汉模式

//饿汉模式
public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){
        System.out.print("Singleton created");
    }
    public stati Singleton getInstance(){
        return instance;
    }
}

2.3.4双层检查加锁

      如果你也不能接受饿汉模式的创建实例的负担,你就需要使用双层检查加锁的方式。即先检查实例是否已经创建了,然后在做同步。这样一来只有第一次才会惊醒同步,大大提高了代码性能。

public class Singleton {
    private volatile static Singleton instance;
    private Singleton(){
        System.out.print("Singleton created");
    }
    public static Singleton getInstance(){
        if (instance == null) {
            sychronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

2.4 总结

      上述四种单例模式方法各有各的优点。但是需要根据不同情况选择不同的实现方法。

      1.单线程工程中使用第一种懒汉模式

      2.多线程(性能无要求)可以使用同步懒汉模式和饿汉模式。

      3.多线程有性能要求时使用双层检查加锁模式。

展开阅读全文
打赏
0
0 收藏
分享
加载中
该评论暂时无法显示,详情咨询 QQ 群:912889742
更多评论
打赏
1 评论
0 收藏
0
分享
返回顶部
顶部