1. 单例模式(Singleton)
1.1. 概述
l 场景:在一个项目中,需要经常对文件系统进行操作,如创建文件,拷贝文件等等,假如这些功能用FileOpe类封装,你如何调用这个类?
FileOpe fo = new FileOpe();
Fo.createFile();
l 但是我们发现,这个类作的工作与具体的业务逻辑似乎关系不大,他做的是一些共性的工作,每次调用都要实例化,似乎太消耗内存。
l 怎样保证在调用的时候,系统中只有一个对象?
1.2. 解决方法:使用单例模式
主要是将构造方法的访问控制符为私有化(private),这样,实例对象就不能直接new。
提供一个对外开放静态方法,进行实例对象。有两种方法:
第一种方法:
class FileOpe{ public static FileOpe fo = new FileOpe(); public static FileOpe getInstance(){ return fo; } private FileOpe(){ System.out.println("构造函数"); } public void createFile(){ System.out.println("创建文件"); } } |
第二种方法:
class FileOpe{ public static FileOpe fo = null; public static synchronized FileOpe getInstance(){//线程同步 if(fo==null){ fo = new FileOpe(); } return fo; } private FileOpe(){ System.out.println("构造函数"); } public void createFile(){ System.out.println("创建文件"); } } |
1.3. 单例模式要点
l 1:利用静态变量可以做到
l 2:第二种方法
l 举例:hibernate中,SessionFactory的生成,注意,有时候看文档,发现有些类的构造函数是被保护的,或者没有构造函数,十有八九用的就是单例模式。
l 如果:模块做的工作比较公共化,或者模块比较消耗内存。
l 例如:字典的载入,application实际上就是实现了单例模式。
l 练习:完成DirCreator,要求里面包含创建目录的代码,使用单例模式,测试。
1.4. 单例模式小结
l 单例模式主要作用是保证在java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录、数据库连接都需要这样的单线程操作。
l 适合做公共工作
l 单例模式就为我们提供了这样实现的可能。使用单例模式的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收。