一、设计模式的概念
设计模式:设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路,使用设计模式最终的目的是实现代码的高内聚和低耦合。
内聚:软件中各个功能模块内部的功能联系;
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。你可以这样理解,一个企业的管理, 最理想的情况就是各个部门各司其职,井然有序,互不干涉, 但是需要沟通交流的时候呢, 各个部门都可以找到接口人专门负责部门沟通以及对外沟通。
二、单例设计模式的概念
单例设计模式:确保某一个类仅有一个实例
单例模式分为:懒汉式单例、饿汉式单例、登记式单例三种。
下面对常用的懒汉式与饿汉式单例两个进行介绍。
三、懒汉式单例设计模式
懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
public class Singleton {
//私有的构造方法,为第一次实例化所用
private Singleton(){}
private static Singleton single = null;
//实例化自己(synchronized为了防止线程同时访问的情况)synchronized
public synchronized static Singleton getInstance() {
if(single == null){
single = new Singleton();
}
return single;
}
}
四、饿汉式单例设计模式
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance()方法调用的时候,单例是已经被初始化
public class Singleton {
//私有构造方法
private Singleton(){}
//自己构造实例对象
private final static Singleton singleton = new Singleton();
//给外界提供获取对象的方法
public static Singleton getInstance(){
return singleton;
}
}
五、单例模式中饿汉式和懒汉式有什么区别?
1、线程安全
饿汉式是线程安全的,可以直接用于多线程而不会出现问题。
懒汉式就不行,它是线程不安全的,如果用于多线程可能会被实例化多次,失去单例的作用。
2、资源加载
饿汉式在类创建的同时就实例化一个静态对象,不管之后会不会使用这个单例,都会占据一定的内存资源,相应的在调用时速度也会更快。
懒汉式顾名思义,会延迟加载,在第一次使用该单例时才会实例化对象出来,第一次掉用时要初始化,如果要做的工作比较多,性能上会有些延迟,第一次调用之后就和饿汉式。
六、单例模式都有哪些应用场景?
1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗?
2.应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
3.Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
4.数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
5. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。